共享內存

  • static local shared memory定義在kernel函數中,只在該kernel中可見

    __global__ void kernelFunc() {
        __shared__ Type data;
        ...
    }
    
  • static global shared memory定義在文件中的任何kernel外,對所有kernel可見

    __shared__ Type data;
    __global__ void kernelFunc() {
        ...
    }
    
  • dynamci shared memory要在變量聲明前添加extern關鍵字,動態共享內存必須是一維的,可以定義爲局部或全局的。一個kernel只能有一段動態共享內存,其大小在調用kernek時指定

    __global__ void kernelFunc() {
        extern __shared__ Type data[];
        ...
    }
    int main() {
        kernelFunc <<<gridDim,blockDim,sharedMemArrLength>>> ();
    }
    
  • bank conflict指的是同一線程束內多個線程訪問同一個bank對應的不同內存地址,通俗的講,就是訪問了不同行的同一列地址。bank width決定了內存操作的粒度,開普勒架構中,可以設置爲4-byte或8-byte,較大的bank width會提高bank conflict的機率,但也能得到較高的帶寬

    cudaError_t cudaDeviceGetSharedMemConfig(cudaSharedMemConfig *pConfig);
    cudaError_t cudaDeviceSetSharedMemConfig(cudaSharedMemConfig config);
    
  • L1 cache和shared memory共享同一塊on-chip memory,可以手動配置某個設備上所有或者單個SM上L1 cache和shared memory的大小

    cudaError_t cudaDeviceSetCacheConfig(cudaFuncCache cacheConfig);
    cudaError_t cudaFuncSetCacheConfig(const void* func,enum cudaFuncCacheca cheConfig);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章