【发布时间】:2021-11-30 19:08:44
【问题描述】:
我有一个大小为 100x200x800 的整数矩阵,它以 100*200*800 的平面向量存储在主机上,也就是说,我有
int* h_data = (int*)malloc(sizeof(int)*100*200*800);
在设备 (GPU) 上,我想用零填充每个维度,以便获得大小为 128x256x1024 的矩阵,分配如下:
int *d_data;
cudaMalloc((void**)&d_data, sizeof(int)*128*256*1024);
获得零填充矩阵的最佳方法是什么?我有两个想法:
- 遍历主机上的各个子矩阵并将它们直接复制到设备上的正确位置。
- 这种方法需要多次
cudaMemcpy调用,因此可能非常慢
- 这种方法需要多次
- 在设备上,为 100x200x800 矩阵和 128x256x1024 矩阵分配内存,并编写一个内核,将样本复制到正确的内存空间
- 这种方法可能要快得多,但需要为设备上的两个矩阵分配内存
有没有类似于 MATLAB 的三维矩阵索引的可能性?在 MATLAB 中,我可以简单地执行以下操作:
h_data = rand(100, 200, 800);
d_data = zeros(128, 256, 1024);
d_data(1:100, 1:200, 1:800) = h_data;
或者,如果我使用cudaMemcpy(d_data, h_data, sizeof(int)*100*200*800, cudaMemcpyHostToDevice); 将数据复制到设备,是否可以重新排序数据,这样我就不必为第二个矩阵分配内存,也许使用cudaMemcpy3D 或cudaMemset3D?
【问题讨论】:
-
第一个问题的答案完全取决于GPU上的计划使用:你将如何寻址数组(稀疏、线性等),你将读取和写入多少次等等。
-
我想使用 cuFFT 库对零填充矩阵执行 FFT 并将数据复制回主机。这应该在流上连续执行,即,一旦计算出 FFT,就应该处理下一个矩阵。我是 CUDA 新手,找不到任何有关稀疏或线性内存的信息。矩阵本身并不稀疏。我希望这些信息对您有所帮助。
-
对于我能想到的大多数考虑因素,第二种方法是首选。此处的额外分配大小为 64MB。那是个问题?不,您不能使用 matlab 样式的矩阵切片表示法来引用或填充 C++ 中的矩阵,这是 CUDA 所基于的。
标签: c++ matrix cuda zero-padding