GPU程式設計

以GPU處理具有粒子位置x、y、z的資料時,就記憶體合併存取而言,下列何種排列方式較有利?

  1. A做成依粒子逐一排列x、y、z的結構陣列
  2. B將所有值以隨機的順序排列
  3. C分成只有x的陣列、只有y的陣列、只有z的陣列(不是結構的陣列,而是陣列的結構)
查看答案與解析

正確答案:C. 分成只有x的陣列、只有y的陣列、只有z的陣列(不是結構的陣列,而是陣列的結構)

在結構陣列(AoS)中,會依序排成粒子0的x、y、z,粒子1的x、y、z……因此各執行緒讀取x時,位址會以每12位元組為間隔而零散。若改為陣列結構(SoA),將x連續排列,相鄰的執行緒就會讀取相鄰位址的x,因而成為合併存取。在CPU的SIMD中,基於同樣的理由,SoA往往也較為有利。

  • A. 相鄰執行緒的x會相隔12位元組。
  • B. 會變得無法合併存取。
  • C. 正確。讀取相同分量之執行緒的位址是連續的。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 關於CUDA共享記憶體(shared memory)的特徵,下列何者正確?
  2. 下列何者是CUDA的__syncthreads()的作用?
  3. 在CUDA中,將__syncthreads()寫在「if (threadIdx.x < 16)」之內,使只有部分執行緒會通過。下列何者是可能發生的情況?
  4. 關於CUDA共享記憶體的記憶庫衝突(bank conflict),下列說明何者正確?
  5. 將32×32的float表格放在共享記憶體中,由線程束的32個執行緒沿著行的方向(縱向)讀取時會發生記憶庫衝突。下列何者是常用的對策?

這個領域的比較