cudaMemcpy 不适用于 64 位

cudaMemcpy doesn't work in 64 bits

我做了一个非常简单的 CUDA 内核,它用 f[i]=i 填充了一个包含 100 个元素的数组(并在另一个内核中使用断言检查它确实这样做了)。

#include<stdio.h>
#include<assert.h>

//definizione di gpuErrchk    

__global__ void setToItself(int* vect){
    vect[threadIdx.x] = threadIdx.x;
}

int main(){

int* a_d;

gpuErrchk( cudaMalloc(&a_d, 100 * sizeof(int)) );

setToItself<<<1,100>>>(a_d);

gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());

然后我将数组复制回主机进行显示

int* a_h[100];

gpuErrchk( cudaMemcpy(a_h, a_d, 100*sizeof(int), cudaMemcpyDeviceToHost) );

for (int i = 0; i < 100; i++)
    printf("%d %d\n",i, a_h[i]);

system("PAUSE");
}

当我在 32 位编译它时它工作正常,但在 64 位我得到

f[0]=0
f[1]=2
f[2]=4
...

并且数组的后半部分未定义。

我尝试将 compute_ 和 sm_ 从 35 改回 20 作为 32 位的默认值,但无济于事。

我尝试在所有地方添加错误检查,但没有输出,这意味着所有函数都返回成功。

我搜索过,但似乎没有与 64 位转换相关的特定问题。那这是什么?

这是不正确的:

int* a_h[100];

应该是:

int a_h[100];

您想要一个包含 100 个 int 的数组。不是 100 个 int 指针 的数组。 int 不要在 32 位和 64 位之间更改它们的大小。 int 指针 确实改变了它们的大小。