詳細程序注解學OpenCL一 環境配置和入門程序

本專欄是通過注解程序的方法學習OpenCL,我覺得一個一個地去摳原理也不是辦法,干脆直接學習程序,然后把相關原理都直接注解到程序語句當中。

原創地址:http://blog.csdn.net/kenden23/article/details/14101657

一開始要配置好環境,我的是nvidia,所以就按照我的電腦舉例,AMD應該也差不多。

1. 首先要到nvidia網站下載適合你顯卡的最新驅動,安裝好

2. 還是在nvidia網站下載好CUDA開發包,安裝好

3. 如果默認安裝路徑的話,路徑應該是在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0

4. 打開這個目錄會發現里面有include和lib文件夾,這就是我們需要配置在visual studio中的文件

5. 打開visual studio(版本基本都無關系,我用的是vs2012),新建一個win32空項目。按下alt+F7打開項目屬性,也可以點擊項目文件右鍵,選擇屬性。

6. 在屬性頁里面找到“C/C++”的“常規”項,點擊,右邊有“附加包含目錄”,然后編輯,添加目錄:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include

7.在屬性頁里面找到“連接器”,點擊其“常規”項,右邊有“附加庫目錄”,然后也是編輯,添加目錄:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\Win32,如果是64位系統可以是:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64。

8. 在屬性頁里找到“常規”項, 右邊“附加依賴項”,編輯,添加lib文件:OpenCL.lib

9. 然后就可以新建源文件,在源文件里面添加相關的OpenCl程序,就可以調試OpenCL程序了。

下面就可以開始學習程序了。

下面是個入門程序,已經注釋好了,注釋包括了基本原理的解析,可以通過直接閱讀和調試程序學習OpenCL了。

本程序是讀取電腦中的支持OpenCL的硬件nvidia和intel和AMD等信息,然后顯示在屏幕上。

[cpp] view plaincopyprint?
  1. #include?<stdio.h>??
  2. #include?<stdlib.h>??
  3. #include?<string.h>??
  4. #include?<iostream>??
  5. ??
  6. #ifdef?MAC??
  7. #include?<OpenCL/cl.h>??
  8. #else??
  9. #include?<CL/cl.h>??
  10. #endif??
  11. ??
  12. int?main()?{??
  13. ??
  14. ????/*?Host?data?structures?*/??
  15. ????cl_platform_id?*platforms;??
  16. ????//每一個cl_platform_id?結構表示一個在主機上的OpenCL執行平臺,就是指電腦中支持OpenCL的硬件,如nvidia顯卡,intel?CPU和顯卡,AMD顯卡和CPU等??
  17. ????cl_uint?num_platforms;??
  18. ????cl_int?i,?err,?platform_index?=?-1;??
  19. ??
  20. ????/*?Extension?data?*/??
  21. ????char*?ext_data;???????????????????????????
  22. ????size_t?ext_size;?????
  23. ????const?char?icd_ext[]?=?"cl_khr_icd";??
  24. ??
  25. ????//要使platform工作,需要兩個步驟。1?需要為cl_platform_id結構分配內存空間。2?需要調用clGetPlatformIDs初始化這些數據結構。一般還需要步驟0:詢問主機上有多少platforms??
  26. ??
  27. ????/*?Find?number?of?platforms?*/??
  28. ????//返回值如果為-1就說明調用函數失敗,如果為0標明成功??
  29. ????//第二個參數為NULL代表要咨詢主機上有多少個platform,并使用num_platforms取得實際flatform數量。??
  30. ????//第一個參數為1,代表我們需要取最多1個platform。可以改為任意大如:INT_MAX整數最大值。但是據說0,否則會報錯,實際測試好像不會報錯。下面是步驟0:詢問主機有多少platforms??
  31. ????err?=?clGetPlatformIDs(5,?NULL,?&num_platforms);??????????
  32. ????if(err?<?0)?{??????????
  33. ????????perror("Couldn't?find?any?platforms.");???????????
  34. ????????exit(1);??????????????????????????????
  35. ????}?????????????????????????????????????
  36. ??
  37. ????printf("I?have?platforms:?%d\n",?num_platforms);?//本人計算機上顯示為2,有intel和nvidia兩個平臺??
  38. ??
  39. ????/*?Access?all?installed?platforms?*/??
  40. ????//步驟1?創建cl_platform_id,并分配空間??
  41. ????platforms?=?(cl_platform_id*)?????????????????????
  42. ????????malloc(sizeof(cl_platform_id)?*?num_platforms);???
  43. ????//步驟2?第二個參數用指針platforms存儲platform??
  44. ????clGetPlatformIDs(num_platforms,?platforms,?NULL);?????????
  45. ??
  46. ????/*?Find?extensions?of?all?platforms?*/??
  47. ????//獲取額外的平臺信息。上面已經取得了平臺id了,那么就可以進一步獲取更加詳細的信息了。??
  48. ????//一個for循環獲取所有的主機上的platforms信息??
  49. ????for(i=0;?i<num_platforms;?i++)???
  50. ????{??
  51. ????????/*?Find?size?of?extension?data?*/??
  52. ????????//也是和前面一樣,先設置第三和第四個參數為0和NULL,然后就可以用第五個參數ext_size獲取額外信息的長度了。??
  53. ????????err?=?clGetPlatformInfo(platforms[i],?????????????
  54. ????????????CL_PLATFORM_EXTENSIONS,?0,?NULL,?&ext_size);??????
  55. ????????if(err?<?0)???
  56. ????????{??
  57. ????????????perror("Couldn't?read?extension?data.");??????????????
  58. ????????????exit(1);??
  59. ????????}?????
  60. ??
  61. ????????printf("The?size?of?extension?data?is:?%d\n",?ext_size);//我的計算機顯示224.??
  62. ??
  63. ????????/*?Access?extension?data?*/????
  64. ????????//這里的ext_data相當于一個緩存,存儲相關信息。??
  65. ????????ext_data?=?(char*)malloc(ext_size);???
  66. ????????//這個函數就是獲取相關信息的函數,第二個參數指明了需要什么樣的信息,如這里的CL_PLATFORM_EXTENSIONS表示是opencl支持的擴展功能信息。我計算機輸出一大串,機器比較新(專門為了學圖形學而購置的電腦),支持的東西比較多。??
  67. ????????clGetPlatformInfo(platforms[i],?CL_PLATFORM_EXTENSIONS,???????
  68. ????????????ext_size,?ext_data,?NULL);????????????????
  69. ????????printf("Platform?%d?supports?extensions:?%s\n",?i,?ext_data);??
  70. ??
  71. ????????//這里是輸出生產商的名字,比如我顯卡信息是:NVIDIA?CUDA??
  72. ????????char?*name?=?(char*)malloc(ext_size);??
  73. ????????clGetPlatformInfo(platforms[i],?CL_PLATFORM_NAME,?????
  74. ????????????ext_size,?name,?NULL);????????????????
  75. ????????printf("Platform?%d?name:?%s\n",?i,?name);??
  76. ??
  77. ????????//這里是供應商信息,我顯卡信息:NVIDIA?Corporation??
  78. ????????char?*vendor?=?(char*)malloc(ext_size);??
  79. ????????clGetPlatformInfo(platforms[i],?CL_PLATFORM_VENDOR,???????
  80. ????????????ext_size,?vendor,?NULL);??????????????????
  81. ????????printf("Platform?%d?vendor:?%s\n",?i,?vendor);??
  82. ??
  83. ????????//最高支持的OpenCL版本,本機顯示:OpenCL1.1?CUDA?4.2.1??
  84. ????????char?*version?=?(char*)malloc(ext_size);??
  85. ????????clGetPlatformInfo(platforms[i],?CL_PLATFORM_VERSION,??????
  86. ????????????ext_size,?version,?NULL);?????????????????
  87. ????????printf("Platform?%d?version:?%s\n",?i,?version);??
  88. ??
  89. ????????//這個只有兩個值:full?profile?和?embeded?profile??
  90. ????????char?*profile?=?(char*)malloc(ext_size);??
  91. ????????clGetPlatformInfo(platforms[i],?CL_PLATFORM_PROFILE,??????
  92. ????????????ext_size,?profile,?NULL);?????????????????
  93. ????????printf("Platform?%d?full?profile?or?embeded?profile?:?%s\n",?i,?profile);??
  94. ??
  95. ????????/*?Look?for?ICD?extension?*/?????
  96. ????????//如果支持ICD這一擴展功能的platform,輸出顯示,本機的Intel和Nvidia都支持這一擴展功能??
  97. ????????if(strstr(ext_data,?icd_ext)?!=?NULL)???
  98. ????????????platform_index?=?i;??
  99. ????????std::cout<<"Platform_index?=?"<<platform_index<<std::endl;??
  100. ????????/*?Display?whether?ICD?extension?is?supported?*/??
  101. ????????if(platform_index?>?-1)??
  102. ????????????printf("Platform?%d?supports?the?%s?extension.\n",???
  103. ????????????platform_index,?icd_ext);??
  104. ??
  105. ????????std::cout<<std::endl;??
  106. ??
  107. ????????//釋放空間??
  108. ????????free(ext_data);??
  109. ????????free(name);??
  110. ????????free(vendor);??
  111. ????????free(version);??
  112. ????????free(profile);??
  113. ????}??
  114. ??????????
  115. ????if(platform_index?<=?-1)??
  116. ????????printf("No?platforms?support?the?%s?extension.\n",?icd_ext);??
  117. ??
  118. ????/*?Deallocate?resources?*/??
  119. ????free(platforms);??
  120. ????return?0;??
  121. }???


每個電腦的輸出結果不一樣的,我電腦的輸出結果是:

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

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

相關文章

解決 IDEA 在 commit 代碼時 git 日志亂碼 (提交時填寫的中文說明亂碼)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.問題描述&#xff1a; idea 開發代碼中的 中文正常&#xff0c;但提交到碼云時填寫的提交日志是亂碼。 提交到碼云后是這樣的&#…

Box 類

public class Box extends JComponent implements Accessible使用 BoxLayout 對象作為其布局管理器的一個輕量級容器。Box 提供幾個對使用 BoxLayout 的容器&#xff08;甚至非 Box 容器&#xff09;有用的類方法。 Box 類可以創建幾種影響布局的不可見組件&#xff1a;glue、s…

神奇的pdfkit工具——將字符串保存為pdf文件

神奇的pdfkit工具——將字符串保存為pdf文件 1、安裝工具包 pip install pdfkit 2、上干貨 import pdfkitdef create_pdf(str_data, to_file):將字符串生成pdf文件 # &#xff08;需下載wkhtmltox&#xff09;將程序路徑傳入config對象config pdfkit.configuration(wkhtmltopd…

OpenCL結構

原標題&#xff1a;從零開始學習OpenCL開發&#xff08;一&#xff09;架構 1 異構計算、GPGPU與OpenCL OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他芯片 異構計算&#xff08;heterogeneous&#xff09;的標準&#xff0c;它是跨平臺的。旨在充分利用GP…

docker-compose 使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 只是一個很簡單的小例。 1. 原本有的容器 2. docker-compose.yml 寫法&#xff1a; gentle 處可以任意寫&#xff0c;gentle 是我的項…

2019.6.20

今日內容 MongoDB可視化工具 一、Scrapy爬蟲框架 二、微信機器人 轉載于:https://www.cnblogs.com/jrc123/p/11062606.html

PCL點云 Lebel:Research

https://blog.csdn.net/wokaowokaowokao12345/article/details/73741957 https://blog.csdn.net/u010696366/article/category/3108337轉載于:https://www.cnblogs.com/radiumlrb/p/10986918.html

AMD GPU+VS2010的OpenCL配置

安裝開發環境可以參照DE4-530的OpenCL開發環境搭建&#xff08;最終版&#xff09;&#xff0c;這篇文章的大部分內容轉載自&#xff1a;http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL資料&#xff0c;包括各種分析工具&#…

ABP開發框架前后端開發系列---(9)ABP框架的權限控制管理

在前面兩篇隨筆《ABP開發框架前后端開發系列---&#xff08;7&#xff09;系統審計日志和登錄日志的管理》和《ABP開發框架前后端開發系列---&#xff08;8&#xff09;ABP框架之Winform界面的開發過程》開始介紹了權限管理的內容&#xff0c;其中只是列出了內部的權限系統的審…

GIL , 線程池 , 同步 , 異步 , 隊列 , 事件

一.什么是GIL 官方解釋:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

Docker - Compose 使用說明、詳解docker-compose

Compose 模板文件 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令關鍵字也比較多。但大家不用擔心&#xff0c;這里面大部分指令…

在Windows下使用OpenCL配置

前言 目前&#xff0c;NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL&#xff08;NVIDIA 的正式版 driver 是從自195.62 版開始&#xff0c;而 AMD則是從9.11 版開始&#xff09;。NVIDIA 的正式版 driver 中包含 OpenCL.dll&#xff0c;因此可以直接使用。AMD 到目前為止…

Linux下啟動mongodb

完成安裝mongodb&#xff08;略&#xff09; 創建數據目錄&#xff1a; # mkdir /data/mongo 創建配置文件 # vi /data/mongo/mongodb.cnf dbpath/data/mongo/ logpath/data/mongo/mongo.log logappendtrue forktrue port27017 或者&#xff1a;不創建配置文件通過mongod參數啟…

Linux調優(文件系統)

查看單個文件是否發生碎片化&#xff08;被存在磁盤非連續磁盤塊上&#xff09;# filefrag -v /var/log/messages 查看文件系統是否存在大量碎片&#xff08;會顯示空閑離散的塊&#xff09;# dumpe2fs /dev/sda1 檢查文件系統中是否有錯誤產生# fsck /dev/sdb1 1、格式化相關 …

使用 nohup 設置后臺進程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引言&#xff1a; 有時候需要在Linux上設置一個后臺進程&#xff0c;但是當你關閉terminal之時&#xff0c;它會被系統kill掉&#xff0…

CVE-2019-0708 BlueKeep的掃描和打補丁

2019獨角獸企業重金招聘Python工程師標準>>> 簡介 CVE-2019-0708 BlueKeep是一個Windows遠程桌面服務的遠程代碼執行漏洞&#xff0c;其危害程度不亞于CVE-2017-0143 EternalBlue&#xff0c;該漏洞影響了某些舊版本的Windows系統。此漏洞是預身份驗證&#xff0c;無…

《OpenCL異構計算》新版中譯本派送中!

《OpenCL異構計算1.2》新鮮出爐&#xff0c;目前市面上仍一書難求&#xff01;我們已向清華出版社訂購到第一批新書。關注異構開發社區&#xff0c;積極參與&#xff0c;就有可能免費獲取新書&#xff01; 1.如果您異構社區的老朋友&#xff0c;請關注&#xff1a;10.1假期后我…

centOS安裝Ftp

1、查看是否安裝 rpm -q vsftpd 2、安裝方法 yum install -y vsftpd 3、查看安裝位置 whereis vsftpd 4、服務管理 //服務狀態systemctl status vsftpd.service//服務啟動systemctl start vsftpd.service//服務停止systemctl stop vsftpd.service//開啟啟動systemctl enable vs…

查看、關閉當前服務器上啟動服務 / 進程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我用 java -jar 的方式啟動了一個服務&#xff0c;然后要關閉這個服務 / 進程。 1. ps -aux 查看當前進程&#xff0c;整個列表最 后一…

Python基礎小結

目錄 一、執行Python程序的兩種方式1.1 交互式1.2 命令行式二、執行Python程序的兩種IDE2.1 Pycharm2.2 Jupyter三、變量3.1 什么是變量?3.2 變量的組成?3.3 變量名的定義規范3.4 定義變量的兩種方式3.5 常量四、注釋4.1 單行注釋4.2 多行注釋4.3 引用計數4.4 垃圾回收機制4.…