首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ AMP 介紹(二):array、array_view、extent 與平鋪優化

     編輯:C++ 入門

數據容器:array vs array_view

特性array<T, N>array_view<T, N>
數據擁有權擁有數據,構造時深拷貝到加速器不擁有數據,僅包裝宿主端指針
數據傳輸時機構造/賦值時立即上傳核心函數首次訪問時按需上傳
同步回宿主隱式(析構/同步調用)需顯式 synchronize() 或析構時
適用場景數據生命週期與加速器綁定,重複使用臨時數據、避免不必要拷貝、多加速器共享

extent:N 維索引空間

  • extent<N> 表示 N 維空間的大小(如 extent<2>(height, width))。
  • 用於定義 parallel_for_each 的計算域、構造 array/array_view。
  • 支持邊界檢查、切片(section())、平鋪(tile())。

平鋪優化

將計算域劃分為固定大小的平鋪(tile),每個平鋪映射到 GPU 的一個線程組(thread block),組內線程共享本地記憶體(共享內存),大幅減少全局內存訪問。

語法

parallel_for_each(extent<2>(H, W).tile<16,16>(),
    [=](tiled_index<16,16> idx) restrict(amp) {
    // idx.local: 平鋪內局部索引 (0..15, 0..15)
    // idx.global: 全局索引
    // idx.tile: 平鋪索引
    // tile_static 變量:共享內存,僅組內可見
    tile_static float shared[16][16];
    // 協作加載數據到共享內存
    // __syncthreads() 同步
    // 計算...
});

關鍵優勢

  1. 數據復用:共享內存加載一次,多線程復用(如矩陣乘法、卷積)。
  2. 合併訪問:線程組協作實現全局內存合併讀寫。
  3. 同步原語:tile_barrier::wait() 替代 __syncthreads()。

完整示例:矩陣乘法平鋪版

void MatrixMulTiled(array_view A, array_view B, array_view C) {
    const int TS = 16;
    parallel_for_each(C.extent.tile(),
        [=](tiled_index idx) restrict(amp) {
        int row = idx.global[0], col = idx.global[1];
        tile_static float As[TS][TS], Bs[TS][TS];
        float sum = 0;
        for (int t = 0; t < A.extent[1]; t += TS) {
            // 協作加載 A 的一塊、B 的一塊到共享內存
            As[idx.local[0]][idx.local[1]] = A(row, t + idx.local[1]);
            Bs[idx.local[0]][idx.local[1]] = B(t + idx.local[0], col);
            idx.barrier.wait();
            for (int k = 0; k < TS; k++)
                sum += As[idx.local[0]][k] * Bs[k][idx.local[1]];
            idx.barrier.wait();
        }
        C[idx.global] = sum;
    });
}

環境需求

  • Windows 8.1+ / Visual Studio 2013+
  • GPU 支持 DirectX 11 (Feature Level 11_0)
  • 標頭:<amp.h>,命名空間 concurrency

總結

array 適合長期駐留 GPU 的數據;array_view 適合零拷貝傳遞;extent.tile + tile_static 是釋放 GPU 算力的關鍵,特別是矩陣運算、圖像處理、科學計算等數據復用率高的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved