我需要一些有关 Cuda GLOBAL 内存的帮助。在我的项目中,我必须声明全局数组以避免在每次内核调用时发送这个数组。
编辑:
我的应用程序可以调用内核超过 1,000 次,每次调用时我都会向他发送一个大小超过 [1000 X 1000] 的数组,所以我认为这需要更多时间,这就是我的应用程序运行缓慢的原因。所以我需要为 GPU 声明全局数组,所以我的问题是
1如何声明全局数组
2如何在内核调用之前从 CPU 初始化全局数组
提前致谢
我需要一些有关 Cuda GLOBAL 内存的帮助。在我的项目中,我必须声明全局数组以避免在每次内核调用时发送这个数组。
编辑:
我的应用程序可以调用内核超过 1,000 次,每次调用时我都会向他发送一个大小超过 [1000 X 1000] 的数组,所以我认为这需要更多时间,这就是我的应用程序运行缓慢的原因。所以我需要为 GPU 声明全局数组,所以我的问题是
1如何声明全局数组
2如何在内核调用之前从 CPU 初始化全局数组
提前致谢
您编辑的问题令人困惑,因为您说您正在向内核发送一个大小为 1000 x 1000 的数组,但您想知道如何使用全局数组来执行此操作。我知道将这么多数据发送到内核的唯一方法是使用全局数组,因此您可能已经在使用全局内存中的数组执行此操作。
尽管如此,至少有两种方法可以在全局内存中创建和初始化数组:
1.静态地,使用__device__
and 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.)
}
(设备变量参考,cudaMemcpyToSymbol 参考)
2.动态地,使用cudaMalloc
and cudaMemcpy
:
#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.)
}
为清楚起见,我省略了您应该对所有 cuda 调用和内核调用进行的错误检查。
如果我很好地理解了这个有点不清楚的问题,那么您想使用全局数组并在每个内核调用中将其发送到设备。这种不良做法会导致高延迟,因为在每次内核调用中,您都需要将数据传输到设备。根据我的经验,这种做法会导致负面加速。
一种最佳方法是使用我所说的触发器技术。你这样做的方式是:
d_arr1
和d_arr2
host -> device
到其中一个数组中。d_arr1
和的指针d_arr2
这样可以避免每次内核调用都传输数据。您仅在主机循环的开始和结束时传输。
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)
}