我必须计算矩阵的元素(参见下面的6*8
示例)。矩阵元素具有依赖关系,因此必须首先计算t1
的值,然后计算t2
的值t1
,而t3
取决于t2
,这取决于____syncthreads()
{{1}}值,等等。
如何计算CUDA中的矩阵元素?我应该只使用一个内核调用并在{{1}}的帮助下计算所有值,还是应该在单独的内核中执行次要对角线中矩阵元素的计算?
答案 0 :(得分:1)
正如您所描述的那样,逻辑方法是为计算的每个阶段启动一个单独的内核。在一个非平凡的问题中,“计算前沿”的大小会迅速增大,因此当解决方案在域中传播时,可以获得一定程度的计算效率。
“最佳”方法可能不是跨越域,而是迭代地解决整个域直到解决方案收敛。 Jeong and Whittaker发表了一篇关于迭代标签校正方法的非常好的论文,用于解决静态Eikonal方程(这是一种类似于矩阵图像的经典迎风扫描计算)。在他们的方法中,计算网格被分解成块,并且包含未收敛的值的每个块被重新计算直到它收敛。当特征穿过子块边界时,任何依赖于更改值的值都会重新标记为未收敛,并且该过程将继续,直到整个域收敛为止。
你可以在CUDA GPU上看到这个算法的Youtube视频here
答案 1 :(得分:0)
您可以使用相同的内核来计算t1值,然后根据t1使用t2值,依此类推。可以递归调用此内核,以根据传递给它的一些参数对不同的值进行操作。
如果t1中的元素彼此不相关,则不需要在内核中使用__syncthreads(),因为在每次内核调用之后都存在隐式屏障。
但是如果它们是依赖的,你必须在内核调用中使用__syncthreads()。