0

我必须计算矩阵的元素(示例见下图6*8)。矩阵元素具有依赖关系,因此t1必须首先计算 的值,然后计算t2依赖于t1的那个,然后计算t3依赖于值的 的t2值,依此类推。

如何计算CUDA中的矩阵元素?我应该只使用一个内核调用并在辅助的帮助下计算所有值,____syncthreads()还是应该在单独的内核中执行次要对角线中矩阵元素的计算?

在此处输入图像描述

4

2 回答 2

1

正如您所描述的,合乎逻辑的方法是为计算的每个阶段启动一个单独的内核。在一个非平凡大小的问题中,“计算前沿”的大小将迅速增长,因此当解决方案在整个域中传播时,可以获得一定程度的计算效率。

“最好”的方法可能不是扫过域,而是迭代地求解整个域,直到解收敛。 Jeong 和 Whittaker发表了一篇关于迭代标签校正方法的非常好的论文,用于求解固定 Eikonal 方程(这是一个经典的迎风扫描计算,类似于您的矩阵图片)。在他们的方法中,计算网格被分解为块,并且包含尚未收敛的值的每个块被重新计算,直到它收敛。当一个特征跨越一个子块边界时,任何依赖于变化值的值都被重新标记为未收敛,并且该过程继续进行,直到整个域收敛。

您可以在 CUDA GPU 上观看此算法的 Youtube 视频

于 2013-05-17T09:38:56.053 回答
0

您可以使用相同的内核来计算 t1 值,然后根据 t1 计算 t2 值,依此类推。根据传递给它的某些参数,可以递归调用此内核以对不同的值进行操作。

如果 t1 中的元素不相互依赖,则无需在内核内部使用 __syncthreads(),因为在每次内核调用之后都有一个隐式屏障。

但是,如果它们是依赖的,则必须在内核调用中使用 __syncthreads()。

于 2013-05-17T11:47:18.000 回答