//創建平臺對象
status = clGetPlatformIDs( 1, &platform, NULL );
注意:上式是選擇默許的第1個平臺。如果我們系統中安裝不止1個opencl平臺,如何選擇自己需要的平臺? 比如我現在安裝了intel和NVIDIA平臺。那末我們就需要進行1個選擇判斷。第1次調用是獲得平臺的數量,numPlatforms里面存的就是平臺的數量。第2個是獲得可用的平臺。另外,我也沒有增加毛病檢測之類的代碼,但是我增加了1個 status 的變量,通常如果函數履行正確,返回的值是 0。
/*Step1: Getting platforms and choose an available one.*/
cl_uint numPlatforms; //the NO. of platforms
cl_platform_id platform = NULL; //the chosen platform
cl_int status = clGetPlatformIDs(0, NULL, &numPlatforms);
if (status != CL_SUCCESS)
{
cout << "Error: Getting platforms!" << endl;
return FAILURE;
}
/*For clarity, choose the first available platform. */
if(numPlatforms > 0)
{
cl_platform_id* platforms = (cl_platform_id* )malloc(numPlatforms* sizeof(cl_platform_id));
status = clGetPlatformIDs(numPlatforms, platforms, NULL);
platform = platforms[0];
free(platforms);
}
詢問裝備名稱,并選擇1個。
/*Step 2:Query the platform and choose the first GPU device if has one.Otherwise use the CPU as device.*/
cl_uint numDevices = 0;
cl_device_id *devices;
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
if (numDevices == 0) //no GPU available.
{
cout << "No GPU device available." << endl;
cout << "Choose CPU as default device." << endl;
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 0, NULL, &numDevices);
devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, numDevices, devices, NULL);
}
else
{
devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
}
下面我們來看下 OpenCL 中 Context 的概念。通常,Context 是指管理 OpenCL 對象和資源的上下文環境。為了管理 OpenCL 程序,下面的1些對象都要和 Context 關聯起來:
? 裝備(Devices): 履行 Kernel 程序對象。
? 程序對象(Program objects): kernel 程序源代碼
? Kernels: 運行在 OpenCL 裝備上的函數
? 內存對象(Memory objects): 裝備上寄存數據
? 命令隊列(Command queues): 裝備的交互機制
? 內存命令(Memory commands)(用于在主機內存和裝備內存之間拷貝數據)
? Kernel 履行(Kernel execution)
? 同步(Synchronization)
注意:創建1個 Context 的時候,我們必須把1個或多個裝備和它關聯起來。對其它的 OpenCL 資源,它們創建時候,也要和 Context 關聯起來,1般創建這些資源的 OpenCL 函數的輸入參數中,都會有 context。
/*Step 3: Create context.*/
cl_context context = clCreateContext(NULL,1, devices,NULL,NULL,NULL);
接下來,我們要看下命令隊列。在 OpenCL 中,命令隊列就是主機的要求,在裝備上履行的1種機制。
在 Kernel 履行前,我們1般要進行1些內存拷貝的工作,比如把主機內存中的數據傳輸到裝備內存中。
另外要注意的幾點就是:對不同的裝備,它們都有自己的獨立的命令隊列;命令隊列中的命令 (kernel 函數)多是同步的,也多是異步的,它們的履行順序可以是有序的,也能夠是亂序的。
命令隊列在 device 和 context 之間建立了1個連接。
命令隊列 properties 指定1下內容:
? 是不是亂序履行(在 AMD GPU 中,好像現在還不支持亂序履行)
? 是不是啟動 profiling。 Profiling 通過事件機制來得到 kernel 履行時間等有用的信息,但它本身也會有1些開消。
/*Step 4: Creating command queue associate with the context.*/
cl_command_queue commandQueue = clCreateCommandQueue(context, devices[0], 0, NULL);
clCreateProgramWithSource()這個函數通過源代碼 (strings),創建1個程序對象,其中 counts 指定源代碼串的數量,lengths 指定源代碼串的長度(為 NULL 結束的串時,可以省略)。固然,我們還必須自己編寫1個從文件中讀取源代碼串的函數。
/*Step 5: Create program object */
const char *filename = "Vadd.cl";
string sourceStr;
status = convertToString(filename, sourceStr);
const char *source = sourceStr.c_str();
size_t sourceSize[] = {strlen(source)};
cl_program program = clCreateProgramWithSource(context, 1, &source, sourceSize, NULL);
//從文件中讀取源代碼串的函數
/* convert the kernel file into a string */
int convertToString(const char *filename, std::string& s)
{
size_t size;
char* str;
std::fstream f(filename, (std::fstream::in | std::fstream::binary));
if(f.is_open())
{
size_t fileSize;
f.seekg(0, std::fstream::end);
size = fileSize = (size_t)f.tellg();
f.seekg(0, std::fstream::beg);
str = new char[size+1];
if(!str)
{
f.close();
return 0;
}
f.read(str, fileSize);
f.close();
str[size] = '
主站蜘蛛池模板:
91真人毛片一级在线播放
|
国产人伦视频在线观看
|
午夜福免费福利在线观看
|
欧美三级在线
|
日本欧美不卡一区二区三区在线
|
国产成人女人视频在线观看
|
亚洲春色另类
|
欧美极品xxx|
性色网站|
亚洲精品自在线拍
|
最近在线更新中文字幕3
|
欧美人与牲禽ⅹxxx伦交
|
国产成人麻豆精品
|
日本japan色系videos护士
日本jizz在线播放
|
欧美一区高清
|
99一级毛片
|
女人18毛片视频一级毛片容
|
毛片的网址
|
亚洲第一永久在线观看
|
欧美一级毛片美99毛片
|
亚洲欧美另类小说
|
日韩有码视频在线
|
欧美午夜色视频国产精品
|
无人区一区二区三区乱码
|
韩国一级做a爰片性色毛片
韩国在线观看免费观看影院
|
国产精美视频
|
亚洲精品一区二区久久
|
日韩欧美亚洲国产高清在线
|
yellow日本
|
精品久久精品久久
|
午夜国产精品久久影院
|
磁力天堂网在线资源www
|
日本在线色
|
免费看在线爱爱小视频
|
日韩欧美国产亚洲
|
欧美三级真做在线观看
|
亚a在线|
久久久久亚洲日日精品
|
一级片.|
欧美人与zoxxxx视频
|
免费在线公开视频
|