簡體   English   中英

CUDA 循環中的空間局部性

[英]Spatial locality in CUDA loops

我正在閱讀更簡單的 CUDA 簡介,我正在考慮這樣的示例:

__global__
void add(int n, float *x, float *y)
{
  int index = threadIdx.x;
  int stride = blockDim.x;
  for (int i = index; i < n; i += stride)
      y[i] = x[i] + y[i];
}

其中每個線程跨過數組。 在正常的 CPU 計算中,人們寧願將數組拆分為連續的子數組,這些子數組在線程之間進行拆分,以便它們可以更好地利用空間局部性。

這個概念是否也適用於 CUDA 的統一 memory? 我想了解在這種情況下最有效的方法是什么。

網格步長循環有利於 memory 訪問的原因是它促進了對全局 memory 的“合並”訪問 簡而言之,合並訪問意味着warp中的相鄰線程正在訪問 memory 中的相鄰位置,在任何給定的讀或寫周期/操作上,被認為是 warp 范圍的。

網格步長循環將索引排列在經線上以促進這種模式。

這與 memory 是否分配有“普通”設備分配器(例如cudaMalloc )或“統一”分配器(例如cudaMallocManaged )是正交的。 在任何一種情況下,設備代碼訪問此類分配的最佳方式是使用合並訪問。

您沒有問過它,但是CUDA 共享 memory也具有其“最佳訪問模式”之一,該模式由經線中的相鄰線程訪問(共享)中的相鄰位置 ZCD69B4957F06CD818D7BF3D61980E2.

暫無
暫無

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

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