我想發送大小size
的在每一維的3D陣列src
,展平爲大小length = size * size * size
的一維數組,爲一個內核,計算結果並將其存儲在dst
。但是,最後,dst
不正確地包含全部0。這裏是我的代碼:正確使用cudaMalloc3D與cudaMemcpy
int size = 256;
int length = size * size * size;
int bytes = length * sizeof(float);
// Allocate source and destination arrays on the host and initialize source array
float *src, *dst;
cudaMallocHost(&src, bytes);
cudaMallocHost(&dst, bytes);
for (int i = 0; i < length; i++) {
src[i] = i;
}
// Allocate source and destination arrays on the device
struct cudaPitchedPtr srcGPU, dstGPU;
struct cudaExtent extent = make_cudaExtent(size*sizeof(float), size, size);
cudaMalloc3D(&srcGPU, extent);
cudaMalloc3D(&dstGPU, extent);
// Copy to the device, execute kernel, and copy back to the host
cudaMemcpy(srcGPU.ptr, src, bytes, cudaMemcpyHostToDevice);
myKernel<<<numBlocks, blockSize>>>((float *)srcGPU.ptr, (float *)dstGPU.ptr);
cudaMemcpy(dst, dstGPU.ptr, bytes, cudaMemcpyDeviceToHost);
我已經離開了的cudaMallocHost()
,cudaMalloc()
和cudaMemcpy()
爲清楚起見,我的錯誤檢查。無論如何這個代碼都不會觸發錯誤。
cudaMalloc3D()
與cudaMemcpy()
的正確用法是什麼?
請讓我知道我是否應該發佈內核的最小測試用例,或者如果問題可以在上面的代碼中找到。
考慮看看您可能會感興趣[這個提問/回答(http://stackoverflow.com/questions/16119943/how-and-當我應該使用pitched指針與cuda-api) –
謝謝,我已經偶然發現,這是非常有益的。 –
現在可以在[從cuda 3D內存複製到線性內存:複製數據不在我預期的地方](http:// stackoverflow。COM /問題/ 16107480 /複製從 - CUDA-3D-存儲器到線性存儲器複製的數據 - 是 - 不其中-I-人口會/ 23052768#23052768)。 – JackOLantern