我已经使用 JCuda 几个月了,我无法将多维数组从设备内存复制到主机内存。有趣的是,我在相反的方向上这样做没有问题(我可以使用多维数组调用我的内核,并且一切都使用正确的值)。
简而言之,我将内核的结果放在一个二维数组中,这个数组的第一个维度是线程的数量,这样每个人都可以在不同的位置写入。
这里有一个例子:
CUdeviceptr pointer_dev = new CUdeviceptr();
cuMemAlloc(pointer_dev, Sizeof.POINTER); // in this case, as an example, it's an array with one element (one thread), but it doesn't matter
// Invoke kernel with pointer_dev as parameter. Now it should contain some results
CUdeviceptr[] arrayPtr = new CUdeviceptr[1]; // It will point to the result
arrayPtr[0] = new CUdeviceptr();
short[] resultArray = new short[3]; // an array of 3 shorts was allocated in the kernel
cuMemAlloc(arrayPtr[0], 3 * Sizeof.SHORT);
cuMemcpyDtoH(Pointer.to(arrayPtr), pointer_dev, Sizeof.POINTER); // Its seems, using the debugger, that the value of arrayPtr[0] isn't changed here!
cuMemcpyDtoH(Pointer.to(resultArray), arrayPtr[0], 3 * Sizeof.SHORT); // Not the expected values in resultArray, probably because of the previous instruction
我究竟做错了什么?
编辑:
显然,有一些限制不允许将设备分配的内存复制回主机,如此(以及更多)线程中所述:link
任何解决方法?我正在使用 CUDA Toolkit v5.0