cuda固定大小全局数组

时间:2013-03-28 19:12:03

标签: arrays memory-management cuda

我认为可以在gpu ex上分配一个数组。 __device__ int device_array[100];没有使用cudaMalloc作为长度是已知的。但是,当我运行以下代码时,会显示一些不相关的数字。我查了一本关于cuda的热门书籍,其中的所有例子都使用了cudaMalloc。固定大小的数组可以像这样使用,或者必须用cudaMalloc分配?

__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;
}

1 个答案:

答案 0 :(得分:1)

罗伯特在评论中提到,在访问主机上的cudaMemcpyFromSymbol符号时,您必须使用__device__。因此,您目前形式的cudaMemcpy调用应该按照“无效参数”的方式给出错误。如果您想看到这一点,请尝试将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,因此在您的情况下,这些在技术上是可选的。所有这一切的主要内容是始终检查您的cuda-call的返回值,因为它们通常会引导您朝着正确的方向前进。