CUDA中的全局变量

use*_*593 7 cuda

如何在CUDA中创建全局变量?你能举个例子吗?

例如,如何在CUDA函数内创建数组

__global__ void test()
{
  int *a = new int[10];
}
Run Code Online (Sandbox Code Playgroud)

或者如何创建全局数组并从此函数访问它.例如

__device__ int *a;
__global__ void test()
{
  a[0] = 2;
}
Run Code Online (Sandbox Code Playgroud)

或者我如何使用如下...

__global__ void ProcessData(int img)
{
   int *neighborhood = new int[8]; 
   getNeighbourhood(img, neighbourhood);
}
Run Code Online (Sandbox Code Playgroud)

我还有一些问题.我发现比较

__device__
Run Code Online (Sandbox Code Playgroud)

如果我定义

"__device__ __constant__" (read only)
Run Code Online (Sandbox Code Playgroud)

将改善内存访问.但我的问题是我在主机内存中有一个数组说

 float *arr = new float[sizeOfTheArray]; 
Run Code Online (Sandbox Code Playgroud)

我想把它作为设备中的变量数组,我需要在设备内存中修改它,我需要将其复制回主机.我该怎么做??

tal*_*ies 9

C++ new运算符在CUDA 4.0的计算能力2.0和2.1(即Fermi)上受支持,因此您可以使用new将全局内存分配到设备符号上,尽管前两个代码片段都不是在实践中如何完成的.

在旧硬件上和/或使用预先CUDA 4.0工具包时,标准方法是cudaMemcpyToSymbol在主机代码中使用API:

__device__ float *a;

int main()
{
    const size_t sz = 10 * sizeof(float);

    float *ah;
    cudaMalloc((void **)&ah, sz);
    cudaMemcpyToSymbol("a", &ah, sizeof(float *), size_t(0),cudaMemcpyHostToDevice);
}
Run Code Online (Sandbox Code Playgroud)

它将动态分配的设备指针复制到符号上,该符号可以直接在设备代码中使用.


编辑:回答这个问题有点像击中移动目标.对于你现在似乎感兴趣的常量内存情况,这是一个完整的工作示例:

#include <cstdio>

#define nn (10)

__constant__ float a[nn];

__global__ void kernel(float *out)
{
    if (threadIdx.x < nn)
        out[threadIdx.x] = a[threadIdx.x];

}

int main()
{
    const size_t sz = size_t(nn) * sizeof(float);
    const float avals[nn]={ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. };
    float ah[nn];

    cudaMemcpyToSymbol("a", &avals[0], sz, size_t(0),cudaMemcpyHostToDevice);

    float *ad;
    cudaMalloc((void **)&ad, sz);

    kernel<<<dim3(1),dim3(16)>>>(ad);

    cudaMemcpy(&ah[0],ad,sz,cudaMemcpyDeviceToHost);

    for(int i=0; i<nn; i++) {
        printf("%d %f\n", i, ah[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这表示将数据复制到常量内存符号,并在内核中使用该数据.

另一方面,这个互联网上充斥着很好的答案,教程,讲义,视频,电子书,示例代码和CUDA编程基础知识的文档.使用您选择的搜索引擎五分钟,您将获得过去几天您一直在询问的每个问题的答案.也许是时候做到这一点了.

  • 说“google it”对于通过这样做进入此页面的人来说并没有多大帮助。 (5认同)