我认为可以在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;
}
答案 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的返回值,因为它们通常会引导您朝着正确的方向前进。