0

我尝试在内核代码中创建一个设备全局内存数组,并在执行完成后将数组内容传递给主机内存。是否可以在设备代码范围内动态创建全局内存数组,或者如果设备代码得分为全局数组,我是否需要将数组定义为外部。

__global__ void kernel_code(...,int array_size){
    __device__ int array_data[size];

    // fill the array_data 
    ...
}

int main(){
    //pass data from array_data to host array
}

如果这不是最可能的做法,是否可以这样做?

4

2 回答 2

1

数组的分配必须能够由编译器静态执行。因此,您不能将它的大小声明为传递给内核的参数。

此外,__device__函数体内不允许有变量声明。所以它必须在模块的全局范围内,而不是在函数范围内。

除此之外,您可以在静态声明的设备数组和主机数组之间传递数据。该__device__变量具有以下特点

  • 驻留在全局内存空间中,
  • 具有应用程序的生命周期,
  • 可从网格内的所有线程和主机通过运行时库 (cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol()) 访问。

因此,在您的主机代码中,您将使用cudaMemcpyToSymbol将数据从主机阵列传输到设备阵列,并使用cudaMemcpyFromSymbol将数据从设备阵列传输到主机阵列。

对于动态大小的设备数组,最常见的做法是使用普通的主机运行时 API 函数来分配它们,例如cudaMalloc将数据从主机数组传输到设备数组,反之亦然cudaMemcpy

于 2013-05-16T21:33:04.580 回答
0

通常的做法是仅在内核中操作设备内存(它要快得多)。只需使用cudaMemcpy(dst, src, cudaMemcpyDeviceToHost)将数据复制到主机内存中(in main())。

于 2013-05-16T23:52:32.250 回答