【问题标题】:CUDA Global Array declaration and initialization before kernel call example内核调用示例之前的 CUDA 全局数组声明和初始化
【发布时间】:2013-02-09 17:38:15
【问题描述】:

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

编辑:

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

1如何声明全局数组

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

提前致谢

【问题讨论】:

  • 共享内存只有块作用域。在内核运行之前,您不能分配和填充共享内存。
  • 也许我需要全局内存?我可以为每个块、线程声明全局数组吗?
  • 是的,但它不能解决任何问题,尝试将数据保存在全局内存中,当您调用内核时,只需将其复制到内核中的共享内存。但是,如果您只使用该数据一次,或者您的线程中只需要一个数据,那么这样做并没有帮助。那么您最好使用普通变量并将该数据分配给它。这样编译器会自动将该变量转换为寄存器。
  • 非常感谢您的回复,您能看看我的编辑吗?

标签: cuda declaration shared-memory


【解决方案1】:

您编辑的问题令人困惑,因为您说您正在向内核发送一个大小为 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 reference, cudaMemcpyToSymbol 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 reference, cudaMemcpy reference)

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

【讨论】:

  • 为什么我们必须手动检查每个 cuda 调用; IE。为什么像cudaMalloc() 这样的函数不做错误检查?
【解决方案2】:

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

最佳方法是使用我称之为 flip-flop 的技术。你这样做的方式是:

  1. 在设备中声明两个数组。 d_arr1d_arr2
  2. 将数据host -&gt; device 复制到其中一个数组中。
  3. 作为内核参数指针传递给d_arr1d_arr2
  4. 将数据处理到内核中。
  5. 在随后的内核调用中,您交换作为参数传递的指针

这样可以避免每次内核调用都传输数据。您仅在主机循环的开始和结束时传输。

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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多