【发布时间】:2017-04-05 15:45:09
【问题描述】:
我不太明白CUDA中__restrict__标签的概念。
我读到使用__restrict__ 可以避免指针别名,特别是,如果指向的变量是只读的,则变量的读取会得到优化,因为它是缓存的。
这是代码的简化版本:
__constant__ float M[M_DIM1][M_DIM2];
__host__ void function(float N[][DIM2], float h_M[][M_DIM2], float P[][DIM2]);
__global__ void kernel_function(const float* __restrict__ N, float *P);
__host__ void function(float N[][DIM2], float h_M[][M_DIM2], float P[][DIM2]) {
int IOSize = DIM1 * DIM2 * sizeof(float);
int ConstSize = M_DIM1* M_DIM2* sizeof(float);
float* dN, *dP;
cudaMalloc((void**)&dN, IOSize);
cudaMemcpy(dN, N, IOSize, cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(M, h_M, ConstSize);
cudaMalloc((void**)&dP, IOSize);
dim3 dimBlock(DIM1, DIM2);
dim3 dimGrid(1, 1);
kernel_function << <dimGrid, dimBlock >> >(dN, dP);
cudaMemcpy(P, dP, IOSize, cudaMemcpyDeviceToHost);
cudaFree(dN);
cudaFree(dP);
}
我是否以正确的方式在 N 上使用__restrict__ 标签,即只读标签?
另外,我读到M上的关键字__constant__的意思是只读和常量,那么这两者有什么区别,分配的类型呢?
【问题讨论】:
标签: pointers memory memory-management cuda