GPU程式設計
設各執行緒的編號為i,如上式每隔32個元素讀取陣列,會比讀取a[i]時更慢。主要原因為下列何者?
float x = a[i * 32];
- A因為相鄰執行緒的位址相隔128位元組,無法合併存取,每個執行緒都得讀取不同的記憶體區塊
- B因為乘法運算耗費時間
- C因為每隔32個元素讀取,無法正確讀到值
查看答案與解析
正確答案:A. 因為相鄰執行緒的位址相隔128位元組,無法合併存取,每個執行緒都得讀取不同的記憶體區塊
float為4位元組,因此在a[i*32]中,相鄰執行緒的位址相隔128位元組。線程束的32個執行緒讀取32個各自獨立的區塊,而每個區塊只用到4位元組。若是a[i],32個執行緒只需一個128位元組的區塊即可,搬運的資料量會有數十倍的差距。在二維陣列中,基本原則是讓執行緒編號對應到內側(位址連續)的索引。
- A. 正確。所讀取的區塊絕大部分都沒有被使用。
- B. 乘法的時間比起等待記憶體要小得多。
- C. 值可以正確讀到,但會變慢。