0

使用双指针语法M[][]定义矩阵然后访问元素是否更好

for (int i=0; i<height; ++i)
{
    for (int j=0; j<width; ++j)
    {
        // do something with M[i][j]
    }
}

或展平向量中的矩阵,将其定义为M[],然后访问其元素,如

for (int i=0; i<height; ++i)
{
    for (int j=0; j<width; ++j)
    {
        int index = j + i * height;
        // do something with M[index]
    }        
}
4

2 回答 2

4

如果不讨论确切的索引计算(您将在实施时修复任何错误)和讨论如何优化索引计算(一个好的编译器会为您做),我个人更喜欢第二个使用 CUDA 的方法。

原因是如果我想在设备和主机之间来回传输这种形式的数据,第二种形式要容易得多。

有很多问题可以解释为什么,这里就不细说了,直接搜索右上角的“CUDA 2D array”,你就会看到传输双指针(即**[][])的复杂性CUDA 中设备和主机之间的数组。 是一个例子,看看 talonmies 给出的答案。

于 2013-11-04T00:18:33.927 回答
2

Robert Crovella 已经告诉过您,第二种方法使主机和设备之间的复制更容易,但是使用一维数组更好的还有另一个原因:由于在第一个版本中您需要取消引用两个指针,您将获得额外的内存读。尤其是在 GPU 上,内存读取比第二个版本中计算索引的速度要慢得多。因此我会使用一维数组的方法,即使矩阵没有在主机和设备之间复制。

于 2013-11-04T00:34:00.970 回答