OpenCL demo 1 建立工程

2021-08-21 14:49:41 字數 2326 閱讀 9165

很久沒更新了,最近都在做opencl的東西,打算分享一下這方面的基礎知識。因為現在平行計算比較普遍,區塊鏈和深度學習都需要做大量的計算,所以opencl和cuda的優勢開始體現出來了。但是確實不知道opencl能撐多久。。。不過概念搞熟之後,cuda和opencl都是差不多的。

以後的分享還是以**為主,寫**的過程講一些我理解的概念~~

因為opencl在桌面機用的多,所以**主要是linux的。windows暫時不會去弄,環境應該都比較好配置。移動端的話...額....,手上沒裝置。。。先算了吧。。。

下面我們直接開始寫**吧。opencl的標頭檔案很簡單,直接

#include
然後我們先獲取platform id。 platform可以看做是乙個裝置集合的載體吧。

cl_platform_id platform_id;

checkerr(clgetplatformids(1, &platform_id, nullptr));

然後通過這個platform_id, 我們就可以獲取裝置了。裝置可以看做是所有計算單元的集合。

cl_device_id device_id;

checkerr(clgetdeviceids(platform_id, cl_device_type_default, 1, &device_id, 0));

通過裝置建立乙個context。context中含有我們需要執行的指令的所有資源和狀態。

cl_context context = clcreatecontext(nullptr, 1, &device_id, nullptr, nullptr, nullptr);
然後建立command queue。command queue是真正顯示卡上執行的指令的command,它屬於context。我們讓顯示卡執行的所有東西都會儲存在command queue上面。我們也可以同時建立多個command queue來同時執行。這個我們以後如果討論async的話可以單獨講一下。

cl_command_queue queue = clcreatecommandqueue(context, device_id, 0, nullptr);
到這裡位置,我們需要的裝置相關的東西就建立完成了。現在開始建立我們顯示卡執行的**。首先是乙個kernel的源**和建立並編譯乙個program 程式。program程式中可以包含乙個或者多個kernel,也可以包含其他的函式。kernel是乙個真正的執行單元,也可以認為是乙個顯示卡的入口函式。

const char * src =

"__kernel void demo1() ";

cl_program program = clcreateprogramwithsource(context, 1, &src, nullptr, nullptr);

checkerr(clbuildprogram(program, 0, nullptr, nullptr, nullptr, nullptr));

從上面的src可以看到,我們這個kernel其實什麼事情也沒做。kernel函式必須包含關鍵字__kernel來向opencl表明這是乙個kernel函式。其他的語法基本和c語言類似。建立並編譯好乙個program之後,我們就可以從這個program中建立kernel了,建立kernel的時候需要指明kernel的名字,在這裡是demo1.

cl_kernel kernel = clcreatekernel(program, "demo1", nullptr);
建立好kernel之後,我們就可以讓顯示卡來執行這個kernel了。這裡指明了global size和local size,下次具體討論這個size的含義,這裡將兩個都設為1,其實就是只執行一下kernel。這裡我們還指明了command queue,表明我們需要把這個執行放在哪個command queue上面。同時finish也需要指定是finish哪個command queue。

size_t global_size = ;

size_t local_size = ;

checkerr(clenqueuendrangekernel(queue, kernel, 1, nullptr, global_size, local_size, 0, nullptr, nullptr));

clfinish(queue);

到此為止,乙個非常非常簡單的opencl程式就完成了。雖然什麼事情也沒有做,但是這個流程已經完整了,並且可以編譯和執行。後面我們會逐步細化並討論更多opencl的特性。

**用了cmake,用法可以查下網上。**上傳到:

1 建立工程

8.建立通用的showinfoandaddcontactview.h m 既可以給聯絡人展示頁面使用,也可以給新增聯絡人頁面使用 9.建立showinfoviewcontroller.h m檔案,並設定自定義檢視,並且將頁面的uitextfield的邊框去掉,uitextview的背景色清掉,並設定...

Catkin建立工程

catin make編譯過程,cmake指令依據你的cmakelists.txt 檔案,生成cmakefiles和makefile檔案,make再依據此cmakefiles和makefile檔案編譯鏈結生成可執行檔案,catkin make是將cmake與make的編譯方式做了乙個封裝的指令工具,規...

Source Insight建立工程

用source insight建立乙個 閱讀工程,source insight是乙個非常優秀的 閱讀工具,使用它來閱讀 修改 新增 移除 來說是非常方便的,學好對它的使用是非常有好處的。一 前提條件 source insight版本 3.50 源 linux 3.10.4 接下來出現這個 遞迴新增到...