如何在CUDA中创建全局变量? 你能举个例子吗?
如何在CUDA函数中创建数组,例如
__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];
我想把它作为设备中的变量数组,我需要在设备内存中修改它,我需要将其复制回主机。我该怎么办?
答案 0 :(得分:9)
使用CUDA 4.0,计算能力2.0和2.1(即Fermi)支持C ++ new
运算符,因此您可以使用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);
}
将动态分配的设备指针复制到符号上,该符号可直接在设备代码中使用。
编辑:回答这个问题有点像击中一个移动的目标。对于您现在似乎感兴趣的常量内存情况,这是一个完整的工作示例:
#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]);
}
}
这表示将数据复制到常量内存符号,并在内核中使用该数据。
另一方面,互联网上充斥着很好的答案,教程,讲义,视频,电子书,示例代码和CUDA编程基础知识的文档。使用您选择的搜索引擎五分钟,您将获得过去几天您一直在询问的每个问题的答案。也许是时候做到这一点了。