我希望程序中的所有访问都能访问全局内存(即使数据在L1 / L2缓存中找到)。为此,我发现可以通过将这些选项传递给nvcc编译器来跳过L1缓存:
-Xptxas -dlcm=cg
CUDA文件说明了这一点:
.cv Cache as volatile (consider cached system memory lines stale, fetch again).
所以,我假设当我使用-dlcm = cg或-dlcm = cv运行时,生成的PTX文件应该与正常生成的文件不同。 (负载应附加.cg或.cv)
我的示例程序:
__global__ void rh_kernel(int *datainRowX, int *datainRowY) {
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid != 0)
return;
int i, x, y;
x = datainRowX[1];
y = datainRowY[2];
datainRowX[0] = x + y;
}
int main(int argc, char** argv) {
int* d_datainRowX;
cudaMalloc((void**)&d_datainRowX, sizeof(int) * 268435456);
int* d_datainRowY;
cudaMalloc((void**)&d_datainRowY, sizeof(int) * 268435456);
rh_kernel<<<1024, 1>>>(d_datainRowX, d_datainRowY);
cudaFree(d_datainRowX); cudaFree(d_datainRowY);
return(0);
}
我注意到无论我传递给nvcc编译器的任何选项(“-Xptxas -dlcm = cg”或“-Xptxas -dlcm = cv”或什么都没有),在所有三种情况下生成的PTX都是相同的。我使用-ptx选项来生成PTX文件。 我错过了什么?有没有其他方法可以实现我的目标? 提前感谢您的时间。
答案 0 :(得分:1)
Kepler GPU中的L1缓存仅保留用于本地内存访问, 例如寄存器溢出和堆栈数据。全局负载缓存在L2中 仅(或在只读数据缓存中)。
基于GK110B的产品,如Tesla K40 GPU加速器,GK20A, 和GK210默认保留此行为
默认情况下,在Kepler上的全局内存读取中不使用L1缓存。因此 - 添加-Xptxas -dlcm=cg
时,PTX没有区别。
无法禁用L2缓存。