在 GPU 上的 CUDA 中保存常量

saving constant in CUDA on GPU

如果我想做一个 for 循环,其中有一个基于 CUDA 代码的计算,并且有一堆常量我不想在 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 到内核?谢谢。

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

__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));