OpenCL memory object 之 Global memory (2)

當我們用clCreateBuffer, clCreateImage創建OpenCL memory object時候,我們需要輸入一個flag參數,這個參數決定memory object的位置
cl_mem    clCreateBuffer (cl_context context, cl_mem_flags flags,  size_t size,  void *host_ptr, cl_int *errcode_ret) ;cl_mem    clCreateImage2D (cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t image_width,  size_t image_height, size_t image_row_pitch, void *host_ptr, cl_int *errcode_ret) 

?

???? 創建memory object后,并沒有立即給它分配空間,而是在第一次device2device之間copy數據時候,才會真正的分配空間,所以我們經常會感覺到,第一次使用某個memory object時候會比較慢。

????? 在AMD APP 2.5中,根據flag值,memory object分配位置如下表4.3所示:

????? 注意AMD 擴展flag: CL_MEM_USE_PERSISTENT_MEM_AMD中,把memory object創建在host visible device memory中,這樣實現了zero copy操作。

???? 我們能夠用函數clEnqueueMapBuffer把device memory object映射到host memory空間,以便cpu進行處理,處理完后,我們要調用clEnqueueUnmapMemObject進行反映射操作,以便device能繼續訪問memory object,注意:在map期間,device不能訪問

下面我們了解一個重要的概念:zero copy memory ojbect以及copy memory object

????? memory object位于host memory,或者位于device meory,但是host能夠直接訪問,這樣的memory object稱作zero copy memory object,因為數據從來沒有在host和device之間進行過實際傳輸,但host和device都能直接訪問它。

????? 如果memory object在device上,需要在host和device之間進行to and from傳輸操作,這種memory object稱作copy memory object。

image

?

image

???

???? 注意CL_MEM_USE_PERSISTENT_MEM_AMDCL_MEM_ALLOC_HOST_PTR的不同之處,前者創建device駐留的zero copy memory,后者創建host駐留的zero copy memory。

??? 使用zero copy memory時候,clEnqueueMapBuffer/clEnqueueMapImage/clEnqueueUnmapMemObject 操作并不產生實際的傳輸操作,所以速度很快,但是對于同一個zero memory object,每次runtime都會返回不同的指針值。

??? 當device以sparse(稀疏)方式訪問host memory時,駐留host的zero copy memory object也能提高程序performance,但要注意:此時,傳輸數據的代價一定大于slower的直接訪問代價

???

???? host能夠以host<->device數據傳輸帶寬速度對駐留device的zero copy memory進行寫操作(combined write),所以當host不需要讀memory object的時候,我們可以使用zero copy device memory避免數據傳輸操作。注意:zero copy device駐留images也是支持的,但zero copy host 駐留images不被支持。linux也不支持zero copy memory object

?

???? 對于copy模式的memory object,? 一般都位于device momeroy,需要在host和device之間來回傳輸數據。注意:實際上只傳輸memory object被request部分數據,這樣提高傳輸性能。

image?

????? 對于使用缺省方式創建的memory object,clEnqueueMapBuffer/clEnqueueMapImage每次返回的指針可能不同,因為runtime每次映射的host memory區域不同,但對于用CL_MEM_USE_HOST_PTR和CL_MEM_ALLOC_HOST_PTR 方式創建的memory object,每次返回的指針是一樣的,因為每次都是返回相同的映射位置,而且對于這兩種方式創建的memory object,每次傳輸前,runtime都要track當前位置是否是最新的memory object,以便決定是否傳輸。[注:缺省方式創建的memory object不能被tracker,因為每次位置都不同,所以總要執行傳輸操作]。

???? 對于用CL_MEM_USE_HOST_PTR創建的memory object,clCreateBuffer/clCreateImage? 每次都要對分配的內存執行pinned操作,刪除memory object后,還要執行unpinned操作。為了最小化pinned/unpinned的代價,分配的內存應該4K對齊,這樣不用每次map/unmap都做pin/unpin操作,但是這樣做確實浪費了一些空間。如果host memory object需要頻繁進行map操作,建議使用CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR,相應的,如果device memory需要頻繁map,使用CL_MEM_USE_PERSISTENT_MEM_AMD以及clEnqueueWriteBuffer

???? 注:當用CL_MEM_ALLOC_HOST_PTR和CL_MEM_COPY_HOST_PTR指針創建memory object時候,memory實際上被創建在pinned host memory中,并初始化數據。CL_MEM_COPY_HOST_PTR相比于CL_MEM_ALLOC_HOST_PTR多了一個把初始化后的數據copy到device memory中的操作,并不推薦這樣使用,還是第一次使用時再傳輸效率更高

?????

????? images 對象傳輸需要額外的costs,因為images必須在線性地址模式(host使用)和tile地址模式(device使用)之間轉換。

?

????? Read/Write/Map memory object的時候,我們要盡量使用non-blocking命令方式,這樣,命令都在緩沖中排隊,通過flush(clFlush)操作,以大批次的方式傳輸到GPU,分攤了runtime準備和提交數據到GPU的開銷。我們能夠用event機制來決定操作之間的依賴關系。目前,runtime還沒有完全挖掘異步DMA傳輸的潛力,但是我們保持正確的編碼是需要的,一旦dirver提供了支持,我們就能提高程序性能。

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

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

相關文章

數據結構進階篇-跳表

大家想必都知道&#xff0c;數組和鏈表的搜索操作的時間復雜度都是O(N)的&#xff0c;在數據量大的時候是非常耗時的。對于數組來說&#xff0c;我們可以先排序&#xff0c;然后使用二分搜索&#xff0c;就能夠將時間復雜度降低到O(logN)&#xff0c;但是有序數組的插入是一個O…

查看本機ssh公鑰,生成公鑰

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 查看ssh公鑰方法&#xff1a; 1.通過命令窗口&#xff1a;打開你的git bash 窗口&#xff0c;進入.ssh目錄&#xff1a;cd ~/.ssh&…

如何實現動態水球圖 --》 echars結合echarts-liquidfill實現

1&#xff09;項目中作為項目依賴&#xff0c;安裝到項目當中(注意必須要結合echars) npm install echarts vue-echarts --save npm install echarts-liquidfill --save 2&#xff09;在需要使用水晶球的組件里引入liquidFill.js import echarts-liquidfill/src/liquidFill.js;…

OpenCL memory object 之選擇傳輸path

對應用程序來說&#xff0c;選擇合適的memory object傳輸path可以有效提高程序性能。 下面先看一寫buffer bandwidth的例子&#xff1a; 1. clEnqueueWriteBuffer()以及clEnqueueReadBuffer() 如果應用程序已經通過malloc 或者mmap分配內存&#xff0c;CL_MEM_USE_HOST_PTR是個…

struts入門超詳細

https://blog.csdn.net/yerenyuan_pku/article/details/52652262轉載于:https://www.cnblogs.com/liuna369-4369/p/10870873.html

RabbitMQ 從入門到精通 (一)

目錄 1. 初識RabbitMQ2. AMQP3.RabbitMQ的極速入門4. Exchange(交換機)詳解4.1 Direct Exchange4.2 Topic Exchange4.3 Fanout Exchange5. Message 消息1. 初識RabbitMQ RabbitMQ 是一個開源的消息代理和隊列服務器&#xff0c;用來通過普通協議在完全不同的應用之間共享數據&a…

接收并解析消息體傳參、解析 json 參數

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.場景&#xff1a;postman 發送了一個 post 請求&#xff0c;如下&#xff1a; 2. 解析方式為用一個 vo 對象來接收 json。把 json 中的…

OpenCL memory object 之 傳輸優化

首先我們了解一些優化時候的術語及其定義&#xff1a; 1、deferred allocation&#xff08;延遲分配&#xff09;&#xff0c; 在第一次使用memory object傳輸數據時&#xff0c;runtime才對memory object真正分配空間。 這樣減少了資源浪費&#xff0c;但第一次使用時要慢一些…

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

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

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

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

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

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

AMD OpenCL 大學課程

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

第一篇 計算機基礎

1.什么是編程語言 python和中文、英語一樣、都是一門語言&#xff0c;只要是語言&#xff0c;其實就庫看成是一種事物與另一種事物溝通的介質。python屬于編程語言&#xff0c;編程語言是程序員與計算機之間溝通的介質&#xff1b;中文和英文則是人與人之間溝通的介質。 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;畫風和內容并不是我最偏好的... 但故事結尾的旁白和歌曲卻打動了一…