如果我想做一个基于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代码中声明全局变量,其中包含我的头文件,但是M
和N
在全局内存中,对CUDA的访问速度应该很慢?或者我每次都必须cudamemcpy()
M
和N
到内核?感谢。
答案 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));