0

我需要在 CUDA C++ 中为每个线程加载 128 位数据。在这种情况下,最好使用 CPU 代码以获得最大性能和兼容性?请问下面的例子访问数据的性能是否相同?

1:使用两个:

unsigned __int64 src1 = arr[threadIdx.x/2];
unsigned __int64 src2 = arr[threadIdx.x/2 + 1];

2:用途:

struct T_src { unsigned __int64 src1, src2; };
T_src src = arr[threadIdx.x];

3:使用特定类型的CUDA:

ulong2 src =  arr[threadIdx.x];
4

1 回答 1

1

使用 CUDA 定义的类型和原语以 GPU 的“本机”术语访问内存是最大化性能的最有可能的方式。这意味着您问题中的选项#3。

如果您打算编写将在 CUDA 上运行并且在重新编译时也可以在独立 CPU 上运行的代码,我建议首先针对 CUDA 性能进行编码,然后为主机 CPU 执行反向移植。与大多数主机 CPU 架构相比,CUDA 对必须如何设置或构建事物更加挑剔,为 CUDA 做“正确”的事情所带来的性能优势将远远超过为主机 CPU 情况做一些次优的事情的成本。

对于 CUDA 案例,我仍然会使用选项 #3,并为主机 CPU 案例定义一个 ulong2 结构。在主机 CPU 案例中复制该结构仍然需要在幕后移动两个(或四个)内存,但无论您在源代码中做什么,都需要这样做。使用最简单、最容易阅读和理解的源代码风格,让编译器负责繁重的工作。

于 2012-08-21T16:26:59.280 回答