OpenCL “速成”沖刺【第一天】

話說軟件開發從來沒有速成一說,一門語言你學的越快,說明你在別的語言上下個功夫越多,所以這次加了引號,只不過幾周之后可能會有一個公司內部OpenCL的考核,雖然本人不需要考核,不過也正好借機整理下之前OpenCL的經驗,一方面幫著下別的同事,一方面也給自己留點干活。這個教程針對有一點C/C++開發經驗的童鞋,如果沒有太多經驗,我建議還是先去學學C語言。


這個是wiki上OpenCL的定義,我感覺想學OpenCL的人應該都已經知道了。

OpenCL?(Open?Computing?Language,開放計算語言) 是一個為異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設備上運行的函數)的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務分割和數據分割的并行計算機制。


第一天,環境,項目,HelloWorld


硬件環境

你需要一臺支持OpenCL的設備,AMD,Nvidia的顯卡,Intel的CPU(最好帶核顯),型號不能太老了,3年內的基本沒問題。

本次教程將以Intel的CPU配合AMD的顯卡為例。


軟件環境

操作系統是windows的,下載安裝AMDAPPSDK for windows,VS2012(老版本也行,我推薦用新的)。

操作系統是linux的,下載安裝AMDAPPSDK for linux,Code::blocks(喜歡VIM的也行,或者說更好)。

下載自己常用的版本控制軟件,和C/C++輔助開發軟件。

PS:OpenCL也就是庫和頭文件,各個廠商的SDK也就是OpenCL+Tools+Samples,別的廠商也有相應的SDK,百度“廠商 OpenCL SDK"的關鍵字組合都能找到。


檢測開發環境

安裝好AMDAPPSDK之后,在命令行下運行clinfo命令,將顯示出你支持OpenCL的硬件信息。

PS:不是AMD的設備,可以用CPUz,GPUz等軟件查詢是否支持OpenCL。


配置項目

個人認為,既然你已經知道了OpenCL就是庫那么應該知道怎么配置項目,否則可能就是不滿足有一點C/C++開發經驗這個前提了。不過為了方便,還是貼出來。

自己去安裝軟件的目錄下找到OpenCL庫文件的位置(一般是C:\Program Files (x86)\AMD APP),linux直接find -name ”opencl“ 命令就行(一般在/opt/AMDAPP下)。

Visual Studio系列(別用VC6,不解釋)

項目屬性->C++->常規->附加包含目錄,把SDK下邊的include目錄加進去。

項目屬性->鏈接器->常規->附加庫目錄,把SDK下邊的lib/x86_64(x64)目錄加進去。

項目屬性->鏈接器->輸入->附加依賴項,輸入opencl.lib

PS: 安裝完SDK,一般會在系統中加入環境變量的,用環境變量配置上邊的路徑更方便,比如$(AMDAPPSDKROOT)include就解決了,這樣換了電腦的話,只要是相同廠商就能通用。

Code::blocks

右鍵項目->Properties...->Project's build options,輸入下邊內容

-I/opt/AMDAPP/include ?-L/opt/AMDAPP/lib/x86_64 ?-lOpenCL?

PS: 其實OpenCL就是配置好頭文件和庫文件,直接粘貼到項目中也行,但是不推薦,換個電腦可能就不好使了。


HelloWorld

本人偷懶就用fixstar的代碼了,建立項目,新建c或者cpp文件,粘貼下列代碼進去:

[cpp] view plaincopyprint?
  1. #include?<stdio.h>??
  2. #include?<stdlib.h>??
  3. #include?<CL/cl.h>??
  4. ??
  5. #define?MEM_SIZE?(128)??
  6. #define?MAX_SOURCE_SIZE?(0x100000)??
  7. ??
  8. int?main()??
  9. {??
  10. ????cl_device_id?device_id?=?NULL;??
  11. ????cl_context?context?=?NULL;??
  12. ????cl_command_queue?command_queue?=?NULL;??
  13. ????cl_mem?memobj?=?NULL;??
  14. ????cl_program?program?=?NULL;??
  15. ????cl_kernel?kernel?=?NULL;??
  16. ????cl_platform_id?platform_id?=?NULL;??
  17. ????cl_uint?ret_num_devices;??
  18. ????cl_uint?ret_num_platforms;??
  19. ????cl_int?ret;??
  20. ??
  21. ????char?string[MEM_SIZE];??
  22. ??
  23. ????FILE?*fp;??
  24. ????char?fileName[]?=?"./main.cl";??
  25. ????char?*source_str;??
  26. ????size_t?source_size;??
  27. ??
  28. ????/*?Load?the?source?code?containing?the?kernel*/??
  29. ????fp?=?fopen(fileName,?"r");??
  30. ????if?(!fp)?{??
  31. ????????fprintf(stderr,?"Failed?to?load?kernel.\n");??
  32. ????????exit(1);??
  33. ????}??
  34. ????source_str?=?(char*)malloc(MAX_SOURCE_SIZE);??
  35. ????source_size?=?fread(source_str,?1,?MAX_SOURCE_SIZE,?fp);??
  36. ????fclose(fp);??
  37. ??
  38. ????/*?Get?Platform?and?Device?Info?*/??
  39. ????ret?=?clGetPlatformIDs(1,?&platform_id,?&ret_num_platforms);??
  40. ????ret?=?clGetDeviceIDs(platform_id,?CL_DEVICE_TYPE_DEFAULT,?1,?&device_id,?&ret_num_devices);??
  41. ??
  42. ????/*?Create?OpenCL?context?*/??
  43. ????context?=?clCreateContext(NULL,?1,?&device_id,?NULL,?NULL,?&ret);??
  44. ??
  45. ????/*?Create?Command?Queue?*/??
  46. ????command_queue?=?clCreateCommandQueue(context,?device_id,?0,?&ret);??
  47. ??
  48. ????/*?Create?Memory?Buffer?*/??
  49. ????memobj?=?clCreateBuffer(context,?CL_MEM_READ_WRITE,MEM_SIZE?*?sizeof(char),?NULL,?&ret);??
  50. ????/*?Create?Kernel?Program?from?the?source?*/??
  51. ????program?=?clCreateProgramWithSource(context,?1,?(const?char?**)&source_str,(const?size_t?*)&source_size,?&ret);??
  52. ??
  53. ????/*?Build?Kernel?Program?*/??
  54. ????ret?=?clBuildProgram(program,?1,?&device_id,?NULL,?NULL,?NULL);??
  55. ??
  56. ????/*?Create?OpenCL?Kernel?*/??
  57. ????kernel?=?clCreateKernel(program,?"hello",?&ret);??
  58. ??
  59. ????/*?Set?OpenCL?Kernel?Parameters?*/??
  60. ????ret?=?clSetKernelArg(kernel,?0,?sizeof(cl_mem),?(void?*)&memobj);??
  61. ??
  62. ????/*?Execute?OpenCL?Kernel?*/??
  63. ????ret?=?clEnqueueTask(command_queue,?kernel,?0,?NULL,NULL);??
  64. ??
  65. ????/*?Copy?results?from?the?memory?buffer?*/??
  66. ????ret?=?clEnqueueReadBuffer(command_queue,?memobj,?CL_TRUE,?0,??
  67. ????????MEM_SIZE?*?sizeof(char),string,?0,?NULL,?NULL);??
  68. ??
  69. ????/*?Display?Result?*/??
  70. ????puts(string);??
  71. ??
  72. ????/*?Finalization?*/??
  73. ????ret?=?clFlush(command_queue);??
  74. ????ret?=?clFinish(command_queue);??
  75. ????ret?=?clReleaseKernel(kernel);??
  76. ????ret?=?clReleaseProgram(program);??
  77. ????ret?=?clReleaseMemObject(memobj);??
  78. ????ret?=?clReleaseCommandQueue(command_queue);??
  79. ????ret?=?clReleaseContext(context);??
  80. ??
  81. ????free(source_str);??
  82. ??
  83. ????getchar();??
  84. ????return?0;??
  85. ??
  86. }??

新建文件,后綴改成.cl,粘貼下列代碼進去:
[cpp] view plaincopyprint?
  1. __kernel?void?hello(__global?char*?string)??
  2. {??
  3. ????string[0]?=?'H';??
  4. ????string[1]?=?'e';??
  5. ????string[2]?=?'l';??
  6. ????string[3]?=?'l';??
  7. ????string[4]?=?'o';??
  8. ????string[5]?=?',';??
  9. ????string[6]?=?'?';??
  10. ????string[7]?=?'W';??
  11. ????string[8]?=?'o';??
  12. ????string[9]?=?'r';??
  13. ????string[10]?=?'l';??
  14. ????string[11]?=?'d';??
  15. ????string[12]?=?'!';??
  16. ????string[13]?=?'\0';??
  17. }??

編譯執行文件。


第一天的內容就是這些,明天將講解上邊的代碼和OpenCL的組織結構。


作業:閱讀上邊的代碼,解釋各個API的含義,寫上中文注釋(最好別直接翻譯),將代碼上傳到自己的版本管理工具上。


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

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

相關文章

Java8函數式編程

最近使用lambda表達式&#xff0c;感覺使用起來非常舒服&#xff0c;箭頭函數極大增強了代碼的表達能力。于是決心花點時間深入地去研究一下java8的函數式。 一、lambda表達式 先po一個最經典的例子——線程 public static void main(String[] args) {// Java7new Thread(new R…

電腦如何獲得管理員權限

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我只是記錄下&#xff0c;方便以后查看。 參見&#xff1a; https://jingyan.baidu.com/article/ab69b270ff426e2ca6189f54.html

.NET混淆器 Dotfuscator如何保護應用程序?控制流了解一下!

Dotfuscator是一個.NET的Obfuscator。它提供企業級的應用程序保護&#xff0c;大大降低了盜版、知識產權盜竊和篡改的風險。Dotfuscator的分層混淆、加密、水印、自動失效、防調試、防篡改、報警和防御技術&#xff0c;為世界各地成千上萬的應用程序提供保護。 Dotfuscator提供…

到底什么才是人生最大的投資

不是房子&#xff0c;不是股票&#xff0c; 是人&#xff0c;跟什么人交往&#xff0c;跟隨什么人&#xff0c; 交什么樣的朋友&#xff0c;其實就是你投資什么人&#xff0c; 而這&#xff0c;是對人生影響最大的。 錢不會給人機會&#xff0c;房子也不會&#xff0c; 只有人會…

tcpdump抓包命令

目錄&#xff1a; 命令格式選項expression表達式示例【命令格式】 man手冊顯示如下 1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]2 [ -c count ]3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]4 [ -i …

百度Ueditor編輯器wordimage踩坑

背景 改造公司老項目后臺編輯器&#xff0c;使用百度的Ueditor做替換。 發現問題 1、ue編輯器初始化后部分參數無法覆蓋ueditor.config.js中的選項。2、wordimage&#xff08;word圖片轉存&#xff09;始終是灰色&#xff0c;無法使用。解決辦法 1、將ueditor.config.js中的inp…

IntelliJ IDEA 配置JDK

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IDEA配置JDK 1、點擊File -->Project Structure&#xff1b; 2、點擊左側標簽頁SDKs選項&#xff0c;再點擊左上角“”&#xff0c;…

get和post 兩種基本請求方式的區別

GET和POST是HTTP請求的兩種基本方法&#xff0c;要說它們的區別&#xff0c;接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中&#xff0c;POST通過request body傳遞參數。 你可能自己寫過無數個GET和POST請求&#xff0c;或者已經看過很多權威網站總結出…

無論是工作還是生活都要記住這些話

1.如果你不喜歡現在的工作&#xff0c;要么辭職不干&#xff0c;要么就閉嘴不言。初出茅廬&#xff0c;往往眼高手低&#xff0c;心高氣傲&#xff0c;大事做不了&#xff0c;小事不愿做。不要養成挑三揀四的習慣。不要雨天煩打傘&#xff0c;不帶傘又怕淋雨&#xff0c;處處表…

蘇嵌第一天,shell中一些基礎知識

一、常用環境變量 1、HOME變量 Linux系統中的每個用戶都有一個相關的稱作HOME的目錄。 2、PATH變量 包含一列用冒號定界的目錄的路徑名字&#xff0c;便于可執行程序的搜索。 3、PS1變量 PS1變量包含了shell提示符&#xff0c;$符號 4、LOGNAME變量 包含用戶的注冊名字…

Java異常處理001:Maven clean package時Failed to clean project: Failed to delete

Java異常處理001&#xff1a;Maven打包時Failed to clean project: Failed to delete 異常日志&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …

Weekly Contest 141

做了第一道后&#xff0c;看了下中間兩道題目&#xff0c;沒怎么看懂就先放著&#xff0c;做完最后一道&#xff0c;然后就沒時間了。 1089. Duplicate Zeros Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining element…

IntelliJ IDEA 中配置、使用 SVN

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.配置svn 如下圖&#xff1a; file -- setting -- version control -- subversion -- 選擇 SVN安裝路徑 -- apply -- OK 2.直接檢出…

切記!職場郵件需注意的細節

電子郵件是如今工作場所重要的通信工具之一&#xff0c;但不是每個人都知道如何很好地使用這個工具。工作郵件也是人際溝通的一種方式&#xff0c;和打電話、面談一樣&#xff0c;有很多學問講究&#xff0c;所以在發送郵件之前一定要深思熟慮。 【發送&#xff0c;抄送&…

李洋瘋狂C語言之初

1.sizeof 是看數據類型所占空間大小&#xff0c;這個大小是以 字節&#xff08;B&#xff09;為單位 char 是C語言的字符數據類型 %d 用在printf 中表示往屏幕打印一個數字 printf ("char&#xff1a; %d\n", sizeof(char)); 數據類型之間的關系&#xff0c;shor…

時時流量查看工具-ifsta,nload,iftop

為什么80%的碼農都做不了架構師&#xff1f;>>> 1、ifstat 是一個網絡流量監測程序。能查看網卡的流出和流入的字節. 概要&#xff1a;ifstat就像iostat/vmstat描述其它的系統狀況一樣&#xff0c;是一個統計網絡接口活動狀態的工具。 參數&#xff1a; -l 監測環路…

10大清宿便排毒方法及簡單排毒瘦小腹運動

早上空腹喝水法&#xff1a;每日起床后空腹喝下500C.C.加鹽的冷開水。只要是冷的飲料或水分&#xff0c;在腸胃空腹時都有刺激腸胃蠕動的效果&#xff0c;而且越冰刺激效果越好&#xff0c;建議不需加鹽&#xff0c;以免高血壓患者因鹽分中的金屬離子造成腎的負擔。 優酪乳加綠…

破解 IntelliJ IDEA 、免費注冊方法、注冊碼

1. 找到hosts文件&#xff0c;在此路徑下 C:\Windows\System32\drivers\etc 2. 修改hosts 文件&#xff0c;在最后 加一行配置&#xff1a; &#xff08;此操作需要電腦管理員權限&#xff09; 0.0.0.0 account.jetbrains.com 3. 從idea 注冊碼生成網站生成一組注冊碼。網…

李洋瘋狂C語言之冒泡排序法

今天的課后任務是2種排序方式&#xff08;冒泡排序和選擇排序&#xff09; 冒泡排序法1 原理&#xff1a;從a[0]開始&#xff0c;依次將其和后面的元素比較&#xff0c;若a[0]>a[i]&#xff0c;則交換他們&#xff0c;一直比較到a[n]。同理對a[1], a[2], ……a[n-1]處理&a…

MySQL水平分區代理Spock Proxy(一)

為什么80%的碼農都做不了架構師&#xff1f;>>> MySQL水平分區代理Spock Proxy 水平分區(sharding)將同一數據表中的數據通過特定的算法進行分離&#xff0c;分別保存在不同的數據表中&#xff0c;從而部署到不同的數據庫服務器上。 水平分區后&#xff0c;數據拆分…