什麼是陣列

將相同型別的值排列儲存,並以元素編號(索引)指定各元素的資料結構。元素在記憶體中連續配置,因此可由元素編號計算位置,以固定的時間讀寫任何元素。有元素編號從0開始的語言,也有從1開始的寫法。

日文名稱: 配列

「陣列」出現在14領域的74道練習題中(程式設計基礎(虛擬碼追蹤), 資料結構與演算法, GPU程式設計等)。

這個名詞所屬的領域: 程式設計基礎(虛擬碼追蹤)

練習陣列的題目

在直接映射快取中,兩個陣列的元素對應到快取的同一個位置,每次交替存取時就互相把對方逐出。這種未命中屬於哪一類?

  1. A強制性未命中(compulsory miss)
  2. B容量未命中
  3. C衝突未命中
查看答案與解析

正確答案:C. 衝突未命中

快取整體明明還有餘裕,卻因兩筆資料爭奪同一組而互相逐出的未命中,就是衝突未命中。可以藉由提高相聯度讓同一組能放入兩條以上,或錯開陣列的起始位置使其對應到不同的組來減少。容量未命中的原因是工作集大於整個快取,即使改為全相聯也不會減少。強制性未命中發生在第一次存取時,不適用於重複的存取。

二維陣列的一列大小為4096位元組(2的冪次)時,沿著行方向走訪元素,即使快取容量有餘裕,未命中也可能變多。作為對策,下列何者有效?

  1. A在每列末端加上填充,使列的大小偏離2的冪次
  2. B將陣列的型別換成相同大小的另一種型別
  3. C將整個陣列重新對齊到較大的2的冪次位址邊界
查看答案與解析

正確答案:A. 在每列末端加上填充,使列的大小偏離2的冪次

若一列剛好是4096位元組,沿著行方向走訪的元素,其位址每次都相差4096的倍數,索引中落在低位12位元內的部分相同,因而集中在極少數的組(每路4 KB以下的L1快取則全部集中在同一組)。當同一組中聚集的列數多於相聯度時,即使容量有餘裕,也會發生互相逐出的衝突未命中。只要在每列加上約一條快取行的填充(padding),各元素所對應的組就會錯開而分散。即使對齊到2的冪次位址,問題也不會改變,換成相同大小的型別也沒有效果。

解析中的「陣列」

出現「陣列」的題目(74題)

  1. a0存放int型(4位元組)陣列a的起始位址,a1存放索引i。下列何者是上述程式碼讀入a2的內容?
  2. 以上述方式走訪C語言的二維陣列a[i][j]時,若內層迴圈使用j,會比內層使用i更容易變快。其原因為下列何者?
  3. 在直接映射快取中,兩個陣列的元素對應到快取的同一個位置,每次交替存取時就互相把對方逐出。這種未命中屬於哪一類?
  4. 在上述迴圈中,int為4位元組、快取行為64位元組,陣列不在快取中且起始位置對齊快取行邊界,若沒有預取,讀取陣列時的未命中率為多少?
  5. 如上將僅加總x座標的處理,改寫成陣列結構(各成分分別放入不同的陣列)後容易變快,其原因為下列何者?
  6. 二維陣列的一列大小為4096位元組(2的冪次)時,沿著行方向走訪元素,即使快取容量有餘裕,未命中也可能變多。作為對策,下列何者有效?
  7. 走訪上述鏈結串列的處理,比讀取相同元素數量的陣列容易大幅變慢,其原因為下列何者?
  8. 像「long cnt[8];」這樣排列每個執行緒的計數器陣列,發生了偽共享。下列何者是最適當的對策?
  9. 以多個執行緒計算陣列所有元素的總和時,為了效能,適合的方法為下列何者?
  10. 想以每個區塊256個執行緒、每個執行緒處理一個元素的方式,處理元素數為1000的陣列。下列何者是應啟動的區塊數?
  11. 設各執行緒的編號為i,如上式每隔32個元素讀取陣列,會比讀取a[i]時更慢。主要原因為下列何者?
  12. 對於只對陣列元素做一次加法這類輕量的處理,若將資料傳送到GPU,有時會比用CPU計算還慢。下列何者是主要原因?
  13. 以GPU進行兩個大型陣列的逐元素加法(c[i] = a[i] + b[i])時,主要決定效能的是什麼?
  14. 想在GPU上只從陣列中取出符合條件的元素,並緊密排列寫入另一個陣列(每個執行緒輸出的數量為0或1)。下列何者是常用來決定各執行緒寫入位址的並行計算?
  15. 對於有 n 個元素的陣列,將所有不同的兩個元素組合各比較一次的處理(以雙重迴圈將第 i 個元素與其後的所有元素比較,並讓 i 逐一前進),其時間複雜度為下列何者?

相關名詞

變數 GPU GPU 核心函式(GPU kernel) 快取行 鏈結串列 CUDA 預取 引數 堆疊 指標(pointer)

前往名詞解釋列表