Arrays cuda固定大小全局阵列

Arrays cuda固定大小全局阵列,arrays,memory-management,cuda,Arrays,Memory Management,Cuda,我认为可以在gpu上分配一个数组,例如\uuuuuuu设备\uuuuuuuu设备\uuu数组[100]不使用Cudamaloc作为已知长度。但是当我运行下面的代码时,会显示一些不相关的数字。我检查了一本关于cuda的畅销书,书中的所有例子都使用了cudaMalloc。一个固定大小的数组可以这样使用,或者它必须与cudamaloc一起分配 __device__ int device_array[100]; __global__ void kernel() { device_array[

我认为可以在gpu上分配一个数组,例如
\uuuuuuu设备\uuuuuuuu设备\uuu数组[100]不使用Cudamaloc作为已知长度。但是当我运行下面的代码时,会显示一些不相关的数字。我检查了一本关于cuda的畅销书,书中的所有例子都使用了cudaMalloc。一个固定大小的数组可以这样使用,或者它必须与cudamaloc一起分配

__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;
}
\uuuuu设备\uuuuuu内部设备\u阵列[100];
__全局无效内核(){
设备_数组[blockIdx.x]=blockIdx.x;
}
无效调用内核(int*主机数组){
内核();
cudaMemcpy(主机阵列、设备阵列、100*sizeof(int)、cudaMemcpyDeviceToHost);
}
int main(){
int主机_数组[100];
调用内核(主机数组);
对于(int i=0;i<100;i++)

正如Robert在评论中提到的,当访问主机上的
\uuu设备\uuuu
符号时,必须使用
cudaMemcpy
。因此,当前形式的
cudaMemcpy
调用应该会给出一个“无效参数”的错误。如果要查看此内容,请尝试将
cudaMemcpy
行更改为:

cudaError_t cuda_status = cudaMemcpy(...); 
std::cout << cudaGetErrorString(cuda_status) << std::endl;
cudaMemcpyFromSymbol的签名为:

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

偏移量默认为0,内存复制方向默认为
cudaMemcpyDeviceToHost
,因此在您的情况下,这些在技术上是可选的。所有这一切的主要好处是始终检查cuda调用的返回值,因为它们通常会引导您正确的方向。

您的代码没有错误检查。很可能
cudaMemcpy
调用失败,但您只是不知道,因为您没有检查返回状态。一旦您确认在运行时发生错误,问题的根源就会变得明显。此外,我们还很好地讨论了如何执行错误检查。如果您想以相同的方式从主机复制到设备,那么您将无法执行此操作函数“cudaMemcpyToSymbol”会更好地为您服务。我建议您在
cudaError_t cudaMemcpyFromSymbol ( void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )