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