英特爾 - 徽標在 FPGA SDK 中為 OpenCL 客製化平台創建異質記憶體系統
指示

在面向 OpenCL 客製化平台的英特爾® FPGA SDK 中創建異質記憶體系統

在客製化平台中實施異質記憶體可實現更多的外部記憶體介面 (EMIF) 頻寬以及更大更快的記憶體存取。異質記憶體存取與最佳化的組合
OpenCL™(1)核心可以顯著提高 OpenCL 系統的效能。
本應用筆記提供了在自訂平台中建立異質記憶體系統以與面向 OpenCL(2) 的英特爾® FPGA SDK 結合使用的指南。英特爾假設您是一位經驗豐富的 FPGA 設計師,正在開發包含異質記憶體系統的客製化平台。
在創建異質記憶體系統之前,請先熟悉下面指定的適用於 OpenCL 的英特爾 FPGA SDK 文件。
相關資訊

  • 適用於 OpenCL 的英特爾 FPGA SDK 程式設計指南
  • 適用於 OpenCL 的英特爾 FPGA SDK 最佳實務指南
  • 適用於 OpenCL Arria 10 GX FPGA 開發套件的英特爾 FPGA SDK 參考平台移植指南

1.1.驗證 FPGA 板和 EMIF 介面的功能

獨立驗證每個記憶體接口,然後使用全域記憶體實例化您的自訂平台。

  1. 使用可以測試每個介面的速度和穩定性的硬體設計來驗證每個記憶體介面。
  2. 使用全域記憶體實例化您的自訂平台。
    1. 對於前amp例如,如果您有 3 個 DDR 接口,則其中一個必須映射為異質記憶體。在這種情況下,請獨立驗證 OpenCL 堆疊與每個 DDR 介面的功能。
      OpenCL 和 OpenCL 標誌是 Apple Inc. 的商標,經 Khronos Group™ 許可使用。
    2.  適用於 OpenCL 的英特爾 FPGA SDK 是基於已發布的 Khronos 規範,並已通過 Khronos 一致性測試流程。當前的一致性狀態可以在以下位置找到: www.khronos.org/conformance。

英特爾公司。 版權所有。 英特爾、英特爾徽標和其他英特爾標誌是英特爾公司或其子公司的商標。 英特爾根據英特爾的標准保修保證其 FPGA 和半導體產品的性能符合當前規格,但保留隨時更改任何產品和服務的權利,恕不另行通知。 英特爾不承擔因應用或使用此處描述的任何信息、產品或服務而產生的任何責任或義務,除非英特爾明確書面同意。 建議英特爾客戶在依賴任何已發布信息和下訂單購買產品或服務之前獲取最新版本的設備規格。 *其他名稱和品牌可能被認為是他人的財產。
ISO 9001:2015 註冊
或者,如果您有兩個 DDR 接口和一個四倍資料速率 (QDR) 接口,請獨立驗證兩個 DDR 接口和 QDR 接口的 OpenCL 堆疊的功能。
英特爾建議您使用 PCI Express® – (PCIe® -) 或 EMIF 專用設計來測試您的記憶體介面。驗證每個記憶體介面功能正常且您的 OpenCL 設計可與記憶體介面的子集搭配使用後,繼續
建立一個功能齊全的異質記憶體系統。 
1.2.修改board_spec.xml File
修改board_spec.xml file 指定 OpenCL 核心可用的異質記憶體系統的類型。
在核心編譯期間,面向 OpenCL 離線編譯器的英特爾 FPGA SDK 將根據您指定的緩衝區位置參數將核心參數指派給記憶體。
1. 瀏覽至 board_spec.xml file 在您的自訂平台的硬體目錄中。
2.開啟board_spec.xml file 在文字編輯器中並相應地修改 XML。
對於前amp文件中,如果您的硬體系統有兩個 DDR 內存作為預設全域內存,以及兩個建模為異質內存的 QDR 存儲體,請修改 board_spec.xml 的內存部分 file 類似以下內容:
















1.3.在 Qsys 中設定多個記憶體分配器
目前,Qsys 設計中的 OpenCL Memory Bank Divider 不支援非 2 的冪數量的記憶體 Bank,這對典型設定沒有限制。然而,在某些情況下,需要非 2 的冪數的記憶體介面。為了容納非 2 的冪數的記憶體接口,請使用多個 OpenCL 記憶體組分配器來建立具有非 2 的冪數的記憶體組的異質記憶體系統。當您擁有真正的異質記憶體系統時,您必須建立多個 OpenCL Memory Bank Divider。考慮一個具有 XNUMX 個 DDR 記憶體介面和 XNUMX 個 QDR 記憶體介面的系統。由於這兩個儲存體具有不同的記憶體拓撲,因此無法將它們組合在單一全域記憶體下。
圖 1. 三組異質記憶體系統框圖
此異質記憶體系統包含兩個DDR記憶體介面和一個QDR記憶體介面。英特爾在面向 OpenCL 客製化平台的 FPGA SDK 中創建異質記憶體系統 - 圖 1如果您使用版本 16.0、16.0.1 或 16.0.2 的 Intel Quartus® Prime 軟體和 Altera SDK for OpenCL,OpenCL Memory Bank Divider 會錯誤地處理跨位址邊界的記憶體突發。若要解決此已知問題,請新增突發大小為 1 的管道橋,並將其 Avalon®Memory-Mapped (Avalon-MM) 主連接埠連接至 OpenCL Memory Bank Divider 的從連接埠。
筆記:
此已知問題已在英特爾 Quartus Prime 軟體和適用於 OpenCL 的英特爾 FPGA SDK 版本 16.1 中修復。
圖 2. 具有管道橋的三組異質記憶體系統框圖 英特爾在面向 OpenCL 客製化平台的 FPGA SDK 中創建異質記憶體系統 - 圖 21.4.修改異質記憶體解決方案的 Boardtest 程式和主機程式碼
使用面向 OpenCL 客製化平台工具套件的英特爾 FPGA SDK 隨附的 boardtest.cl 核心來測試客製化平台的功能和效能。
boardtest 程式是一個 OpenCL 內核,可讓您測試主機到裝置頻寬、記憶體頻寬以及自訂平台的一般功能。

  1. 瀏覽至/board/custom_platform_toolkit/tests/boardtest 目錄。
  2. 開啟boardtest.cl file 在文字編輯器中,為每個全域記憶體參數分配一個緩衝區位置。
    對於前amp樂:
    __內核無效
    mem_stream (__global__attribute__((buffer_location(“DDR”))) uint *src, __global __attribute__((buffer_location(“QDR”))) uint *dst, uint arg, uint arg2)
    這裡,uint *src 分配給DDR 內存,uint *dst 分配給QDR 內存。 board_spec.xml file 指定兩個儲存系統的特性。
  3. 若要在 OpenCL 系統中利用異質記憶體解決方案,請透過將 CL_MEM_HETEROGENEOUS_INTELFPGA 標誌新增至 clCreateBuffer 呼叫來修改主機程式碼。
    對於前amp樂:
    ddatain = clCreateBuffer(上下文, CL_MEM_READ_WRITE | memflags
    CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(無符號) * vectorSize, NULL, &status);
    英特爾強烈建議您在寫入緩衝區之前將緩衝區位置設定為內核參數。使用單一全域記憶體時,您可以在將緩衝區指派給核心參數之前或之後寫入緩衝區。在異質記憶體系統中,主機在寫入緩衝區之前設定緩衝區位置。換句話說,主機會在呼叫 clEnqueueWriteBuffer 函數之前呼叫 clSetKernelArgument 函數。
    在主機程式碼中,按以下順序呼叫 clCreateBuffer、clSetKernelArg 和 clEnqueueWriteBuffer:
    ddatain = clCreateBuffer(上下文, CL_MEM_READ_WRITE | memflags |
    CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(無符號) * vectorSize, NULL, &status);
    … 狀態 = clSetKernelArg(kernel[k], 0, sizeof(cl_mem), (void*)&ddatain);
    … 狀態 = clEnqueueWriteBuffer(佇列, ddatain, CL_FALSE, 0, sizeof(無符號) * vectorSize,hdatain, 0, NULL, NULL);
    ALTERAOCLSDKROOT/board/custom_platform_toolkit/tests/boardtest/host/memspeed.cpp file 呈現這些函數呼叫的類似順序。
  4.  修改boardtest.cl後 file 和主機程式碼,編譯主機和核心程式碼並驗證它們的功能。
    編譯核心程式碼時,必須透過包含 –no-interleaving 來停用所有記憶體系統的突發交錯aoc 指令中的選項。

相關資訊
停用全域記憶體的突發交錯(–no-interleaving )

1.5.驗證異質記憶體的功能 系統
為了確保異質記憶體系統正常運作,請在主機程式碼中取消設定 CL_CONTEXT_COMPILER_MODE_INTELFPGA 標誌。
在具有同構記憶體的 OpenCL 系統中,您必須選擇在主機程式碼中設定 CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 標誌以停用 .aocx 的讀取 file 以及FPGA的重新編程。在實例化您的電路板以驗證自訂平台的功能而無需設計佈局規劃和指定 LogicLock™ 區域時,設定 CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 標誌非常有用。
對於異質記憶體系統,運行時環境必須讀取每個緩衝區的緩衝區位置,如 .aocx 所述 file,驗證儲存系統的功能。但是,您可能想要驗證自訂平台的功能,而不實現電路板設計的最終功能,例如設計佈局規劃和指定 LogicLock 區域。

  1. 驗證主機程式碼中是否未設定 CL_CONTEXT_COMPILER_MODE_INTELFPGA 標誌。
  2. 瀏覽至看板/自訂平台的 /source/host/mmd 目錄。
  3. 開啟 acl_pcie_device.cpp 記憶體映射裝置 (MMD) file 在文字編輯器中。
  4.  修改acl_pcie_device.cpp中的reprogram函數 file 新增一個 return 0;線,如下圖:
    int ACL_PCIE_DEVICE::重新編程(void *data, size_t data_size)
    {
    返回0;
    // 假設失敗
    int 重新編程失敗 = 1;
    // 假設 fpga.bin 中沒有 rbf 或 hash
    int rbf_or_hash_not_provided = 1;
    // 假設基礎和匯入修訂雜湊值不匹配
    int hash_mismatch = 1;

    }
  5. 重新編譯acl_pcie_device.cpp file.
  6. 驗證 CL_CONTEXT_COMPILER_MODE_INTELFPGA 標誌是否保持未設定狀態。
    注意力: 添加後返回0;到重新編程函數並重新編譯MMD file,運行時環境會讀取.aocx file 並分配緩衝區位置,但不會重新編程 FPGA。您必須手動將 FPGA 映像與 .aocx 進行匹配 file。若要扭轉此行為,請刪除 return 0;從重新編程功能並重新編譯MMD file.

1.6. 文件修訂歷史

日期 版本 變化
17 月 XNUMX 日 2017.12.01 • 將CL_MEM_HETEROGENEOUS_ALTERA 更名為CL_MEM_HETEROGENEOUS_INTELFPGA。
16 月 XNUMX 日 2016.12.13 • 將CL_CONTEXT_COMPILER_MODE_ALTERA 更名為CL_CONTEXT_COMPILER_MODE_INTELFPGA。

英特爾 - 徽標在面向 OpenCL 的英特爾® FPGA SDK 中創建異質記憶體系統
客製化平台
英特爾在 FPGA SDK 中為 OpenCL 客製化平台創建異質記憶體系統 - 圖示 1 傳送回饋
英特爾在面向 OpenCL 客製化平台的 FPGA SDK 中創建異質記憶體系統 - 圖標 在線版
英特爾在 FPGA SDK 中為 OpenCL 客製化平台創建異質記憶體系統 - 圖示 1 傳送回饋
編號:683654
版本:2016.12.13

文件/資源

英特爾在 FPGA SDK 中為 OpenCL 客製化平台創建異質記憶體系統 [pdf] 指示
在適用於 OpenCL 自訂平台的 FPGA SDK 中建立異質記憶體系統,建立異質記憶體系統,適用於 OpenCL 自訂平台的 FPGA SDK

參考

發表評論

您的電子郵件地址不會被公開。 必填欄位已標記 *