簡體   English   中英

CUDA 共享 memory 銀行沖突意外時間

[英]CUDA shared memory bank conflict unexpected timing

我試圖重現銀行沖突場景( 這里是最小的工作示例),並決定在 warp(32 個線程)訪問 32 個大小為 32 位的整數時執行基准測試,每個整數在以下 2 個場景中:

  • 當沒有銀行沖突時( offset=1
  • 當存在 bank 沖突時( offset=32 ,所有線程都訪問bank 0

這是代碼示例(僅內核):

__global__ void kernel(int offset) {

    __shared__ uint32_t shared_memory[MEMORY_SIZE];

    // init shared memory
    if (threadIdx.x == 0) {
        for (int i = 0; i < MEMORY_SIZE; i++) 
            shared_memory[i] = i;
    }

    __syncthreads();

    uint32_t index = threadIdx.x * offset;

    // 2048 / 32 = 64 
    for (int i = 0; i < 64; i++)
    {
        shared_memory[index] += index * 10;

        index += 32;
        index %= MEMORY_SIZE;

        __syncthreads();   
     }
}

我預計offset=32的版本比offset=1的版本運行得慢,因為訪問應該被序列化,但發現它們有類似的 output 時間。 這怎么可能?

你只有 1 個工作扭曲,所以你的性能最大的問題是每個(或大多數)GPU 命令等待完成前一個。 這隱藏了大多數共享 memory 沖突減速。 每個共享 memory 訪問權限也有很多工作。 cosf中有多少個小命令? 請嘗試簡單的 integer 算術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM