天天看點

OpenCL概述 續篇(Introduction to OpenCL)

摘要:OpenCL記憶體對象就是一些OpenCL資料,這些資料一般在裝置記憶體中,能夠被拷入也能夠被拷出。OpenCL記憶體對象包括buffer對象和image對象。

OpenCL記憶體對象:

OpenCL記憶體對象就是一些OpenCL資料,這些資料一般在裝置記憶體中,能夠被拷入也能夠被拷出。OpenCL記憶體對象包括buffer對象和image對象。

buffer對象:連續的記憶體塊----順序存儲,能夠通過指針、行列式等直接通路。

image對象:是2維或3維的記憶體對象,隻能通過read_image() 或 write_image()來讀取。image對象可以是可讀或可寫的,但不能同時既可讀又可寫。

OpenCL概述 續篇(Introduction to OpenCL)

該函數會在指定的context上建立一個buffer對象,image對象相對比較複雜,留在後面再講。

flags參數指定buffer對象的讀寫屬性,host_ptr可以是NULL,如果不為NULL,一般是一個有效的host buffer對象,這時,函數建立OpenCL buffer對象後,會把對應host buffer的内容拷貝到OpenCL buffer中。

OpenCL概述 續篇(Introduction to OpenCL)

在Kernel執行之前,host中原始輸入資料必須顯式的傳到device中,Kernel執行完後,結果也要從device記憶體中傳回到host記憶體中。我們主要通過函數clEnqueue{Read|Write}{Buffer|Image}來實作這兩種操作。從host到device,我們用clEnqueueWrite,從device到host,我們用clEnqueueRead。clEnqueueWrite指令包括初始化記憶體對象以及把host 資料傳到device記憶體這兩種操作。當然,像前面一段說的那樣,也可以把host buffer指針直接用在CreateBuffer函數中來實作隐式的資料寫操作。 (Introduction to OpenCL)

OpenCL概述 續篇(Introduction to OpenCL)

這個函數初始化OpenCL記憶體對象,并把相應的資料寫到OpenCL記憶體關聯的裝置記憶體中。其中,blocking_write參數指定是數拷貝完成後函數才傳回還是資料開始拷貝後就立即傳回(阻塞模式于非阻塞模式)。Events參數指定這個函數執行之前,必須要完成的Event(比如先要建立OpenCL記憶體對象的Event)。

OpenCL概述 續篇(Introduction to OpenCL)

OpenCL程式對象:

程式對象就是通過讀入Kernel函數源代碼或二進制檔案,然後在指定的裝置上進行編譯而産生的OpenCL對象。

OpenCL概述 續篇(Introduction to OpenCL)
OpenCL概述 續篇(Introduction to OpenCL)

這個函數通過源代碼(strings),建立一個程式對象,其中counts指定源代碼串的數量,lengths指定源代碼串的長度(為NULL結束的串時,可以省略)。當然,我們還必須自己編寫一個從檔案中讀取源代碼串的函數。

OpenCL概述 續篇(Introduction to OpenCL)

對context中的每個裝置,這個函數編譯、連接配接源代碼對象,産生device可以執行的檔案,對GPU而言就是裝置對應shader彙編。如果device_list參數被提供,則隻對這些裝置進行編譯連接配接。options參數主要提供一些附加的編譯選項,比如宏定義、優化開關标志等等。

如果程式編譯失敗,我們能夠根據傳回的狀态,通過調用clGetProgramBuildInfo來得到錯誤資訊。

加上建立記憶體對象以及程式對象的代碼如下:

1:       
2: #include "stdafx.h"      
3: #include <CL/cl.h>      
4: #include <stdio.h>      
5: #include <stdlib.h>      
6: #include <time.h>      
7: #include <iostream>      
8: #include <fstream>      
9:       
10: using namespace std;      
11: #define NWITEMS 262144      
12:       
13: #pragma comment (lib,"OpenCL.lib")      
14:       
15: //把文本檔案讀入一個string中      
16: int convertToString(const char *filename, std::string& s)      
17: {      
18: size_t size;      
19: char* str;      
20:       
21: std::fstream f(filename, (std::fstream::in | std::fstream::binary));      
22:       
23: if(f.is_open())      
24: {      
25: size_t fileSize;      
26: f.seekg(0, std::fstream::end);      
27: size = fileSize = (size_t)f.tellg();      
28: f.seekg(0, std::fstream::beg);      
29:       
30: str = new char[size+1];      
31: if(!str)      
32: {      
33: f.close();      
34: return NULL;      
35: }      

原文作者:邁克老狼

繼續閱讀