如何在CUDA中将所有访问指向全局内存?

时间:2017-01-16 08:51:58

标签: cuda

我希望程序中的所有访问都能访问全局内存(即使数据在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文件。 我错过了什么?有没有其他方法可以实现我的目标? 提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

根据Cuda Toolkit Documentation

  

Kepler GPU中的L1缓存仅保留用于本地内存访问,   例如寄存器溢出和堆栈数据。全局负载缓存在L2中   仅(或在只读数据缓存中)。

     

基于GK110B的产品,如Tesla K40 GPU加速器,GK20A,   和GK210默认保留此行为

默认情况下,在Kepler上的全局内存读取中不使用L1缓存。因此 - 添加-Xptxas -dlcm=cg时,PTX没有区别。

无法禁用L2缓存。