OpenCL memory object 之 傳輸優化

首先我們了解一些優化時候的術語及其定義:

?

1、deferred allocation(延遲分配),

???? 在第一次使用memory object傳輸數據時,runtime才對memory object真正分配空間。 這樣減少了資源浪費,但第一次使用時要慢一些[一個context多個設備,一個memory object多個location,見前面的blog]。

?

?

2.peak interconntect bandwith(峰值內聯帶寬

???? host和device之間通過PCIE總線傳輸數據,PCIE2.0的上行、下行帶寬都是8Gb/s, 對于我們的程序,能達到3Gb/s就不錯了,我的筆記本測試只有1.2Gb/s。

?

?

3.Pinning(對內存實施pinning操作)

???? host memory準備向gpu傳輸時,都要首先進行pinning,就是lock page(禁止交換到外存),pinning操作有一定的性能開銷,開銷的大小和pinning的host memory大小有關,越大就開銷越大。我們可以把host memory分配到pre pinned memory中減少這種開銷。

?

4.WC(write combined operation)

?? WC是cpu寫固定地址時的一個特性,通過把鄰接的寫操作綁定到一個cacheline,然后發一個寫請求,實現了批量寫操作。[Gpu內部也有相似的地址合并操作]

?

?

5.uncached access

??? 一些內存區域被配置為uncache access,cpu訪問比較慢,但是有利于向device memory傳輸數據,比如前篇日志提到device visible host memory。

?

?

6.USWC(無cache的寫綁定)

?? gpu訪問uncached的host memory不會產生cache一致性問題,速度會比較快,cpu寫因為WC也比較快,相對來說cpu讀會變慢。在APU上,這個操作會提供一個快速的cpu寫,gpu讀的path。

?

下面看看buffer的分配及使用:

?

1.normal buffer

????? 用CL_MEM_READ_ONLY/CL_MEM_WRITE_ONLY/CL_MEM_READ_WRITE標志創建的buffer位于device memory中,GPU能夠以很高的bandwidth訪問這些它,例如對一些高端的顯卡,超過100GB/s,host要訪問這些內存,只能通過peak interconntect bandwith(PCIE)。

?

2. zero copy buffer

???? 這種buffer并不做實際的copy工作(除非特殊指定執行copy操作,比如clEnqueueCopyBuffer)。根據創建buffer的type參數,它可能位于host memory也可能位于device memory。

?

???? 如果device及操作系統支持zero copy,則下面buffer類型可以使用:

?

? The CL_MEM_ALLOC_HOST_PTR buffer
– zero copy buffer駐留在host。
– host能夠以全帶寬訪問它。
– device通過interconnect bandwidth訪問它。
– 這塊buffer被分配在prepinned的host memory中


? The CL_MEM_USE_PERSISTENT_MEM_AMD buffer is
– zero copy buffer 駐留在GPU device中。
– GPU能全帶寬訪問它。
– host能夠以interconnect帶寬訪問它 (例如streamed寫帶寬host->device,低的讀帶寬,因為沒有cache利用)。

– 在host和device之間通過interconnect帶寬傳輸數據。

?

注意:創建buffer的大小是平臺dependience的,比如在某個平臺上一個buffer不能超過64M,總的buffer不能超過128M等

?

zero copy內存在APU上可以得到很好的效果,cpu可以高速的寫,gpu能夠高速的讀,但因為無cache,cpu讀會比較慢。

1. buffer = clCreateBuffer(CL_MEM_ALLOC_HOST_PTR | CL_MEM_READ_ONLY)
2. address = clMapBuffer( buffer )
3. memset( address ) or memcpy( address ) (if possible, using multiple CPU
cores)
4. clEnqueueUnmapMemObject( buffer )
5. clEnqueueNDRangeKernel( buffer? )

對于數據量小的傳輸,zero copy時延(map,unmap等)通常低于相應的DMA引擎時延。

?

3. prepinned buffer

???? pinned buffer類型是CL_MEM_ALLOC_HOST_PTR/CL_MEM_USE_HOST_PTR, buffer初始就被創建在prepinned內存中。 EnqueueCopyBuffer以interconnect帶寬在host和device之間傳輸數據(沒有pinned和unpinned開銷)。

??? 注意:CL_MEM_USE_HOST_PTR能夠把已經存在的host buffer轉化到pinned memory中去,但是為了保證傳輸速度,host buffer必須保證256字節對齊。如果只是用來傳輸數據的話,CL_MEM_USE_HOST_PTR 類型memory對象會一直為prepinned內存,但是它不能作為kernel參數。如果buffer要在kernel中使用的話,runtime會在device創建一個該buffer cache copy,接下來的copy操作不會通過fast path(要保持cache一致性)。

?

下面的一些函數支持prepinned memory,注意:讀取memory可以使用offset:
? clEnqueueRead/WriteBuffer
? clEnqueueRead/WriteImage
? clEnqueueRead/WriteBufferRect (Windows only)

分類: OpenCL
綠色通道:好文要頂關注我收藏該文與我聯系
邁克老狼2012
關注 - 7
粉絲 - 127
+加關注
1
0
(請您對文章做出評價)
? 上一篇:OpenCL memory object 之 Global memory (2)
? 下一篇:OpenCL memory object 之選擇傳輸path

posted on 2011-12-18 13:52 邁克老狼2012 閱讀(841) 評論(1) 編輯 收藏

評論

#1樓??

老狼,最近一直在你的博客上學習,學到了很多東西,這篇文章有點東西不太明白,幫忙解答下唄
1、在某個平臺上一個buffer不能超過64M,總的buffer不能超過128M等
總的buffer是指CPU+GPU的zero-copy buffer嗎 , 分別64M?
2、clMapBuffer( buffer ) 是必須的嗎 它和clEnqueueMapBuffer有什么區別?用clEnqueueMapBuffer可以代替clmMapBuffer嗎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VBS使文本框的光標位于所有字符后

有時候在文本框里會顯示一部分提示信息,用戶在這些提示信息后面輸入文本,但是將焦點設置于文本框后,光標總是在文本框的最前面, 用戶輸入的時候需要按"-->"鍵將光標移到最后才能輸入,這樣的操作很不爽。我…

記錄ionic 最小化應用時所遇的問題

ionic3與ionic4最小化插件安裝不一樣: ionic3安裝方法: $ ionic cordova plugin add cordova-plugin-appminimize $ npm install --save ionic-native/app-minimize4 并在app.module.ts中 注入依賴: import { AppMinimize } from ionic-nativ…

解決 --- Docker 啟動時報錯:iptables:No chain/target/match by the name

問題:jenkins的docker containner啟動失敗,報錯:failed programming external connectivity … iptables: No chain/target/match by that name” docker 服務啟動的時候,docker服務會向iptables注冊一個鏈,以便讓dock…

AMD OpenCL 大學課程

AMD OpenCL大學課程是非常好的入門級OpenCL教程,通過看教程中的PPT,我們能夠很快的了解OpenCL機制以及編程方法。下載地址:http://developer.amd.com/zones/OpenCLZone/universities/Pages/default.aspx 教程中的英文很簡單,我相信…

第一篇 計算機基礎

1.什么是編程語言 python和中文、英語一樣、都是一門語言,只要是語言,其實就庫看成是一種事物與另一種事物溝通的介質。python屬于編程語言,編程語言是程序員與計算機之間溝通的介質;中文和英文則是人與人之間溝通的介質。 2.什么…

47.QT-QChart之曲線圖,餅狀圖,條形圖使用

1.使用準備 在pro中, 添加QT charts 然后在界面頭文件中添加頭文件并聲明命名空間,添加: #include <QtCharts> QT_CHARTS_USE_NAMESPACE 2.QChart之曲線圖 繪制曲線圖需要用到3個類 QSplineSeries: 用于創建有由一系列數據組成的曲線.類似的還有QPieSeries(餅圖數據). Q…

Docker 部署應用、jar 工程 docker 方式部署

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 把要部署的工程打成一個jar包。&#xff08;我的工程叫 gentle &#xff09; 打 jar 的方法&#xff1a;超簡單方法&#xff1a; Int…

流浪不是我的初衷 ... ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 或許&#xff0c;我從來就是一個習慣沉默的人 ... 或許&#xff0c;我從來就不善于傾述 ... 會有難過的時候&#xff0c;會有覺得累的…

第二階段沖刺(2)

1、整個項目預期的任務量 &#xff08;任務量 所有工作的預期時間&#xff09;和 目前已經花的時間 &#xff08;所有記錄的 ‘已經花費的時間’&#xff09;&#xff0c;還剩余的時間&#xff08;所有工作的 ‘剩余時間’&#xff09; &#xff1b; 所有工作的預期時間&#…

VS2008+OpenCL環境配置

1. 配置.cl文件支持: 1.1. 打開VS2008&#xff0c; 工具->選項->文本編輯器->文件擴展名&#xff0c;添加一個新的擴展名&#xff0c;指定編輯器為Microsoft Visual C 。這樣在OpenCL文件中就能顯示C的語法高亮了。 1.2. 配置OpenCL語法高亮 - 打開目錄~\NVIDIA Corpo…

第十二周學習進度報告

代碼時間&#xff1a;17小時左右&#xff0c; 代碼量&#xff1a;300行左右&#xff0c; 閱讀&#xff1a;一個app的誕生20頁&#xff1b;構建之法30頁 知識&#xff1a;抽象典型用戶&#xff08;具有代表性&#xff09;和場景&#xff0c;去設計相應功能。 轉載于:https://www…

我的桃花源

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 看了一個動畫片&#xff08;《貓與桃花源》&#xff09;&#xff0c;畫風和內容并不是我最偏好的... 但故事結尾的旁白和歌曲卻打動了一…

promise實例

不廢話&#xff0c;粘代碼 function ajax(method, url, data) {let request new XMLHttpRequest();return new Promise(function (resolve, reject) {request.onreadystatechange function () {if (request.readyState 4) {if (request.status 200) {resolve(request.respo…

華為路由器配置DHCP中繼

DHCP(動態主機配置協議)理論知識&#xff1a;DHCP主要用來為客戶機自動配置I P地址相關的網絡參數&#xff0c;包括IP地址、子網掩碼、默認網關、DNS服務器等。 DHCP 通信為廣播的方式&#xff0c;因此當需要 DHCP 服務器為不同廣播域&#xff08;路由或 VLAN 網段&#xff09;…

基于GPU的K-Means聚類算法

聚類是信息檢索、數據挖掘中的一類重要技術&#xff0c;是分析數據并從中發現有用信息的一種有效手段。它將數據對象分組成為多個類或簇&#xff0c;使得在同一個簇中的對象之間具有較高的相似度&#xff0c;而不同簇中的對象差別很大。作為統計學的一個分支和一種無監督的學習…

IntelliJ IDEA 工具篇之如何切換 git 分支

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、進入項目和工程。 2、點擊右下角的git:master&#xff0c;然后選擇origin/master&#xff0c;然后選擇你要切換的分支&#xff0c;我…

IDEA---SpringBoot同一個項目多端口啟動

-Dserver.port xxxx 轉載于:https://www.cnblogs.com/tonyzt/p/10987116.html

好程序員Web前端分享無法忽視的JavaScript技巧

好程序員Web前端分享無法忽視的JavaScript技巧。在大家從事web前端的工作中&#xff0c;很容易忽視一些JavaScript的小技巧&#xff0c;今天為大家總結了一些容易被大家忽略的技巧&#xff0c;希望能夠對大家有所幫助。1、過濾唯一值Set類型是在ES6中新增的&#xff0c;它類似于…

GPU通用計算調研報告

摘要&#xff1a;NVIDIA公司在1999年發布GeForce256時首先提出GPU&#xff08;圖形處理器&#xff09;的概念&#xff0c;隨后大量復雜的應用需求促使整個產業蓬勃發展至今。GPU在這十多年的演變過程中&#xff0c;我們看到GPU從最初幫助CPU分擔幾何吞吐量&#xff0c;到Shader…

git 圖形化工具 GitKraken 的使用 —— 分支的創建與合并

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 分支管理是Git工作流的重點 在之前的文章中通過GitKraken可以很清楚的看到&#xff0c;每一次commit&#xff0c;git把他們串成了一條線…