我必须计算矩阵的元素(参见下图中的6*8示例)。矩阵元素具有依赖性,因此必须首先计算t1的值,然后计算依赖于t1的t2的值,而不是依赖于t2值的t3的值,依此类推。
如何计算CUDA中的矩阵元素?我应该只使用一个内核调用并在____syncthreads()的帮助下计算所有值,还是应该在单独的内核中计算次对角线中的矩阵元素?

发布于 2013-05-17 17:38:56
正如您所描述的,合理的方法是为计算的每个阶段启动一个单独的内核。在一个非平凡大小的问题中,“计算前沿”的大小将迅速增长,因此当解决方案在整个域中传播时,可以获得一定程度的计算效率。
“最好的”方法可能不是横跨整个领域,而是迭代地求解整个领域,直到解决方案收敛。Jeong and Whittaker发表了一篇非常好的论文,介绍了一种迭代标签校正方法,用于求解平稳的Eikonal方程(这是一种经典的迎风扫射计算,类似于您的矩阵图片)。在他们的方法中,计算网格被分解成块,包含未收敛的值的每个块都被重新计算,直到它收敛。当特征跨过子块边界时,依赖于改变的值的任何值都被重新标记为未收敛,并且该过程继续,直到整个域收敛。
你可以在Youtube上看到这个算法在CUDA GPU here上运行的视频
发布于 2013-05-17 19:47:18
您可以使用相同的内核计算t1值,然后根据t1计算t2值,依此类推。可以递归地调用这个内核,根据传递给它的一些参数对不同的值进行操作。
如果t1中的元素不相互依赖,那么就不需要在内核中使用__syncthreads(),因为在每次内核调用之后都会有一个隐式的屏障。
但是,如果它们是依赖的,则必须在内核调用中使用__syncthreads()。
https://stackoverflow.com/questions/16603444
复制相似问题