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