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
指针 确实改变了它们的大小。
我做了一个非常简单的 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
指针 确实改变了它们的大小。