2013-03-28 68 views
0

我认为一个数组可以分配在gpu前。 __device__ int device_array[100];而不使用cudaMalloc作为长度是已知的。但是,当我运行下面的代码显示一些不相关的数字。我研究了一本关于cuda的流行书,其中的所有示例都使用了cudaMalloc。一个固定大小的数组可以像这样使用,或者它必须分配给cudaMalloc?cuda固定大小的全局数组

__device__ int device_array[100]; 

__global__ void kernel() { 

    device_array[blockIdx.x] = blockIdx.x; 
} 

void call_kernel(int *host_array) { 

    kernel<<<100,1>>>(); 

    cudaMemcpy(host_array, device_array, 100 * sizeof(int), cudaMemcpyDeviceToHost); 
} 

int main() { 

    int host_array[100]; 

    call_kernel(host_array); 

    for (int i = 0; i < 100; i++) 
     cout << host_array[i] << endl; 
} 
+0

你的代码没有错误检查。可能是'cudaMemcpy'调用失败,但您不知道它,因为您没有检查返回状态。一旦确认运行时发生了错误,问题的根源就会变得明显。 – talonmies

+0

更多[线索](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-variable-qualifier)。如何做错误检查很好地讨论[这里](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime- API)。 –

回答

1

正如罗伯特在他的评论中提到,您在访问主机上的__device__符号时使用cudaMemcpyFromSymbol。因此,您现在的调用应该给出“无效参数”的错误。如果你想看到这一点,请尝试更改cudaMemcpy行:

cudaError_t cuda_status = cudaMemcpy(...); 
std::cout << cudaGetErrorString(cuda_status) << std::endl; 

不管怎么说,如果你想找到正确答案,你应该改变你的cudaMemcpy线为:

cudaMemcpyFromSymbol(host_array, device_array, 100 * sizeof(int), 0, cudaMemcpyDeviceToHost); 

签名为cudaMemcpyFromSymbol是:

cudaError_t cudaMemcpyFromSymbol (void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost) 

偏移的默认值为0和内存拷贝方向默认为cudaMemcpyDeviceToHost,所以这些都是TECHN在你的情况下是可选的。所有这一切的主要内容是始终检查您的cuda电话的返回值,因为它们通常会引导您朝着正确的方向前进。

+0

如果你想以同样的方式从主机复制到设备,那么你可能会更好地使用函数“cudaMemcpyToSymbol”。我建议通过http://docs.nvidia.com/cuda/cuda-runtime-api/index.html#group__CUDART__MEMORY查看可用的CUDA运行时API函数 – alrikai