我不太瞭解CUDA的__restrict__
標籤的概念。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__
,意思是說只讀和常量,那麼它們之間的區別是什麼,分配的類型是什麼?
CUDA不是C.請勿垃圾標籤。 – Olaf