cudaMemcpy不能以64位工作

时间:2015-05-22 14:26:25

标签: cuda 32bit-64bit

我制作了一个非常简单的CUDA内核,它用f [i] = i填充了100个元素的数组(并在另一个内核中使用assert进行了检查,确实已经这样做了)。

#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位转换相关的特殊问题。这是什么?

1 个答案:

答案 0 :(得分:1)

这是不正确的:

int* a_h[100];

应该是:

int a_h[100];

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