在GPU上保存CUDA中的常量

时间:2015-02-20 20:55:06

标签: cuda

如果我想做一个基于CUDA代码的计算的for循环,并且每次执行代码时都有一堆常量,我不想在CPU和GPU之间来回传输,有什么我可以做的吗?

例如:

float* a, *b, *c;  // a, b, and c changes each time for loop is executed
int M, N;          // M and N get their value prior to the for loop, and 
                   // they do not change during the for loop

for (int n = 0; n < 100; n++)
{
    CUDAComputation(a,b,c,M,N);
} 

__global__ void CUDAComputation(double *a,
                                double *b,
                                double *c,
                                int M,
                                int N)
{
    // cuda-based code
}

我想我可以在.cu代码中声明全局变量,其中包含我的头文件,但是MN在全局内存中,对CUDA的访问速度应该很慢?或者我每次都必须cudamemcpy() MN到内核?感谢。

1 个答案:

答案 0 :(得分:2)

M和N是通过内核参数发送的。考虑到调用内核有一些开销,我不会关心这个事务的速度,发送2个int的额外开销也不会很大。但是,您可以执行以下操作:

__device__ int d_M, d_N;
int h_M, h_N;

__global__ void CUDAComputation(){ 
 //d_M and d_N are accessible in here
}

void runKernel(){
    h_M=25; h_N=24;
    cudaMemcpyToSymbol(d_N, &h_M, sizeof(int));
    cudaMemcpyToSymbol(d_M, &h_M, sizeof(int));
    myKernel<<<128, 128>>>();
}

如果你需要一些不变的东西,你可以使用类似的东西:

__device__ float* devPointer; float* ptr;
cudaMalloc(&ptr, 256 * sizeof(float)); 
cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));