OpenCL程式分為兩個部份,一部份是核心代碼,負責具體算法。另一部份是主程式負責初始化OpenCL和準備資料。主程式加載核心代碼,并按照即定方法進行運算。
核心代碼可以寫在主程式裡面,也可以寫在另一個文本檔案裡,有點像DX中的HLSL和OPENGL裡的GLSL。哈哈,明白意思就行了。我們用第一種方法,把代碼跟源程式分開寫。
調用OpenCL大至分7個步驟
1:初始化OpenCL
2:建立上下文裝置
3:建立指令隊列
4:建立資料緩沖區
5:将資料上傳到緩沖區
6:加載編譯代碼,建立核心調用函數
7:設定參數,執行核心
8:讀回計算結果。
下面我們通過一個向量相加的程式來了解OpenCL 。有A,B兩個四維向量,相加後值存在C向量裡。OpenCL會根據使用者提供的維數,将向量分解成多個任務分發給多個CPU計算。
源碼分兩部份
(一)vecadd.cl核心代碼。
?
1 2 3 4 5 6 7 8 | |
__kernel 指明這是一個OpenCL核心,__global 說明指針指向的是全局的裝置記憶體空間,其它的就是C語言的函數的文法。kernel必須傳回空類型。
(二)main.cpp代碼
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | |
運算結果:
[1,2,3,4] + [5,6,7,8] = [6,8,10,12]