0

我认为可以在 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;
}
4

1 回答 1

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 的返回值,因为它们通常会引导您朝着正确的方向前进。

于 2013-03-28T19:41:50.043 回答