CUDA中的全局变量

CUDA中的全局变量,cuda,Cuda,如何在CUDA中创建全局变量?? 你能给我举个例子吗 例如,如何在CUDA函数中创建数组 __global__ void test() { int *a = new int[10]; } __device__ int *a; __global__ void test() { a[0] = 2; } 或者如何创建全局数组并从此函数访问它。比如说 __global__ void test() { int *a = new int[10]; } __device__ int *a;

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

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

__global__ void test()
{
  int *a = new int[10];
}
__device__ int *a;
__global__ void test()
{
  a[0] = 2;
}
或者如何创建全局数组并从此函数访问它。比如说

__global__ void test()
{
  int *a = new int[10];
}
__device__ int *a;
__global__ void test()
{
  a[0] = 2;
}
或者我怎样才能像下面这样使用

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

但我还是有一些问题。我发现相比之下

__device__
如果我定义

"__device__ __constant__" (read only)
将改善内存访问。 但我的问题是主机内存中有一个数组

 float *arr = new float[sizeOfTheArray]; 

我想将其作为设备中的变量数组,我需要在设备内存中修改它,并将其复制回主机。如何计算它?

< p> C++ <代码>新< /Cord>运算符,它支持CUDA 4的计算能力2和2.1(即费米),因此可以使用<代码>新< /Cord>将全局内存分配到设备符号上,尽管您的前两个代码段都不在实践中如何执行。 在旧硬件和/或CUDA 4.0之前的工具包上,标准方法是在主机代码中使用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);
}
它将动态分配的设备指针复制到可以直接在设备代码中使用的符号上


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

#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]);
    }
}
#包括
#定义nn(10)
__常数浮点数a[nn];
__全局无效内核(浮点*out)
{
如果(线程idx.x对于(int i=0;iI需要一个全局数组和设备上的变量。我怎么做?例如,我将定义PI=3.14…我将在调用设备函数时使用。例如,图像宽度和高度,我使用主机函数读取图像,并将其传递给设备函数,我希望在设备内存中保留W和H,以便我可以从其他函数中访问它,而无需将其作为参数传递。我希望像这样使用。全局void ProcessData(int-img){int-neighborary=new-int[8];getneighborary(img,neighborary);}嗨,实际上我需要访问设备函数中的“a”,我需要修改它,然后我需要将它复制到主机上。我怎么做?我不能在设备代码中修改数组a的值。我怎么做?说“google it”对通过这样做进入此页面的人没有帮助。