好吧,我正在尝试为我以 15 美元购买的"new"FX 570 学习 CUDA;D 现在在代码中没有错误,array1_host 以正确的值开始,但是当我将内存从设备复制到主机时,值保持不变。 如果我清空第二个内核调用(在这个项目中尝试多个内核),同样的事情会发生
#include <cuda_runtime.h>
#include <iostream>
#pragma comment (lib, "cudart")
#define N 5000
__global__ void addArray(float* a, float* b)
{
a[threadIdx.x] += b[threadIdx.x];
}
__global__ void timesArray(float* a, float* b)
{
a[threadIdx.x] *= b[threadIdx.x];
}
int main(){
float array1_host[N];
float array2_host[N];
float *array1_device;
float *array2_device;
cudaError_t err;
for(int x = 0; x < N; x++){
array1_host[x] = (float) x * 2;
array2_host[x] = (float) x * 6;
}
err = cudaMalloc((void**)&array1_device, N*sizeof(float));
err = cudaMalloc((void**)&array2_device, N*sizeof(float));
err = cudaMemcpy(array1_device, array1_host, N*sizeof(float), cudaMemcpyHostToDevice);
err = cudaMemcpy(array2_device, array2_host, N*sizeof(float), cudaMemcpyHostToDevice);
dim3 dimBlock( N );
dim3 dimGrid ( 1 );
addArray<<<dimGrid, dimBlock>>>(array1_device, array2_device);
timesArray<<<dimGrid, dimBlock>>>(array1_device, array2_device);
err = cudaMemcpy(array1_host, array1_device, N*sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(array1_device);
cudaFree(array2_device);
std::cout << cudaGetErrorString(err) << "\n\n\n\n\n\n";
std::cout << array1_host;
cudaDeviceReset();
system("pause");
return 0;
}
最佳答案
你有一个错误,因为 N 是 5000,但是 block 中的线程数是有限制的——这取决于计算能力 link to features on wiki .
试试这个代码:
#define K 200
....
dim3 dimBlock( K );
dim3 dimGrid ( N/K );
要调试您的代码,您可以在每次调用内核或其他函数后使用 cudaGetLastError()
来了解错误所在的位置 exaple about CUDA errors .
关于c++ - CUDA 内存不返回主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15380812/