我制作了一个非常简单的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位转换相关的特殊问题。这是什么?
答案 0 :(得分:1)
这是不正确的:
int* a_h[100];
应该是:
int a_h[100];
您想要一个包含100个int
值的数组。不是100个int
指针的数组。 int
值不会在32位和64位之间更改其大小。 int
指针确实会改变它们的大小。