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

标签 cuda declaration shared-memory

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

编辑:

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

1 如何声明全局数组

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

提前致谢

最佳答案

您编辑的问题令人困惑,因为您说您正在向内核发送一个大小为 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 全局数组声明和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15052370/

相关文章:

c - C中的内存分配/释放

c++ - C++ 中的 int *x 和 int* x 有区别吗?

linux - 64 位 Linux 机器中可能的最大共享内存大小

cuda - CUDA 是否允许同时在同一个 gpu 上使用多个应用程序?

c++ - 声明或定义

c++ - CUDA:最小化大数据类型的银行冲突

c - 如何确定ftok共享内存冲突

c - 使用 sys 信号量进行输出同步

c++ - 使用 nvprof 进行分析时没有 GPU 事件

cuda - 在 CUDA 9 中附加了一些以 `_sync()` 命名的内在函数;语义相同?