内核调用示例之前的CUDA全局数组声明和初始化

时间:2013-02-24 13:50:29

标签: cuda declaration shared-memory

我需要一些Cuda GLOBAL内存的帮助。在我的项目中,我必须声明全局数组,以避免在每次内核调用时发送此数组。

编辑:

我的应用程序可以调用内核超过1000次,并且在每次调用时我都会向他发送一个大小超过[1000 X 1000]的数组,所以我认为这需要更多时间,这就是为什么我的应用程序运行缓慢。所以我需要为GPU声明全局数组,所以我的问题是

1 如何声明全局数组

2 如何在内核调用之前从CPU初始化全局数组

提前致谢

2 个答案:

答案 0 :(得分:4)

您编辑的问题令人困惑,因为您说您正在向内核发送大小为1000 x 1000的数组,但您想知道如何使用全局数组执行此操作。我知道将这么多数据发送到内核的唯一方法就是使用一个全局数组,所以你可能已经在全局内存中使用了一个数组。

尽管如此,至少有两种方法可以在全局内存中创建和初始化数组:

1.静态地,使用__device__cudaMemcpyToSymbol,例如:

 #define SIZE 100
 __device__ int A[SIZE];
 ...
 int main(){
   int myA[SIZE];
   for (int i=0; i< SIZE; i++) myA[i] = 5;
   cudaMemcpyToSymbol(A, myA, SIZE*sizeof(int));
   ...
   (kernel calls, etc.)
 }

device variable referencecudaMemcpyToSymbol reference

2.动态地,使用cudaMalloccudaMemcpy

 #define SIZE 100
 ...
 int main(){
   int myA[SIZE];
   int *A;
   for (int i=0; i< SIZE; i++) myA[i] = 5;
   cudaMalloc((void **)&A, SIZE*sizeof(int));
   cudaMemcpy(A, myA, SIZE*sizeof(int), cudaMemcpyHostToDevice);
   ...
   (kernel calls, etc.)
 }

cudaMalloc referencecudaMemcpy reference

为清楚起见,我省略了error checking,您应该对所有cuda调用和内核调用进行操作。

答案 1 :(得分:0)

如果我很清楚这个问题,有点不清楚,你想使用全局数组并在每个内核调用中将它发送到设备。这种错误实践会导致高延迟,因为在每次内核调用中都需要将数据传输到设备。根据我的经验,这种做法导致消极加速。

最佳方式是使用我所谓的触发器技术。你这样做的方式是:

  1. 在设备中声明两个数组。 d_arr1d_arr2
  2. 将数据host -> device复制到其中一个阵列中。
  3. 作为内核的参数指针传递给d_arr1d_arr2
  4. 将数据处理到内核中。
  5. 在随后的内核调用中,您将作为参数传递的指针交换为
  6. 这样就可以避免每次内核调用都传输数据。您只能在主机循环的开始和结束时进行传输。

    int a, even =0;
    for(a=0;a<1000;a++)
    {
      if (even % 2 ==0 )
       //call to the kernel(pointer_a, pointer_b)
      else
      //call to the kernel(pointer_b, pointer_a)
    }