GPU程式設計

設各執行緒的編號為i,如上式每隔32個元素讀取陣列,會比讀取a[i]時更慢。主要原因為下列何者?

float x = a[i * 32];
  1. A因為相鄰執行緒的位址相隔128位元組,無法合併存取,每個執行緒都得讀取不同的記憶體區塊
  2. B因為乘法運算耗費時間
  3. C因為每隔32個元素讀取,無法正確讀到值
查看答案與解析

正確答案:A. 因為相鄰執行緒的位址相隔128位元組,無法合併存取,每個執行緒都得讀取不同的記憶體區塊

float為4位元組,因此在a[i*32]中,相鄰執行緒的位址相隔128位元組。線程束的32個執行緒讀取32個各自獨立的區塊,而每個區塊只用到4位元組。若是a[i],32個執行緒只需一個128位元組的區塊即可,搬運的資料量會有數十倍的差距。在二維陣列中,基本原則是讓執行緒編號對應到內側(位址連續)的索引。

  • A. 正確。所讀取的區塊絕大部分都沒有被使用。
  • B. 乘法的時間比起等待記憶體要小得多。
  • C. 值可以正確讀到,但會變慢。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 以GPU處理具有粒子位置x、y、z的資料時,就記憶體合併存取而言,下列何種排列方式較有利?
  2. 關於CUDA共享記憶體(shared memory)的特徵,下列何者正確?
  3. 下列何者是CUDA的__syncthreads()的作用?
  4. 在CUDA中,將__syncthreads()寫在「if (threadIdx.x < 16)」之內,使只有部分執行緒會通過。下列何者是可能發生的情況?
  5. 關於CUDA共享記憶體的記憶庫衝突(bank conflict),下列說明何者正確?

這個領域的比較