讀書筆記-OpenCL編程指南 HelloWorld

main函數會實現或調用一組函數,完成以下操作:
在這裏插入圖片描述

可以和OpenCL入門二:OpenCL基礎概念中的代碼進行對比

OpenCL內核

在這裏插入圖片描述

__kernel void vector_add(global const float *a, global const float *b, global float *result)
{ 
 int gid = get_global_id(0);
 result[gid] = a[gid] + b[gid];
}
————————————————
版權聲明:本文爲CSDN博主「肥叔菌」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/asmartkiller/article/details/86611145

主函數

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

選擇OpenCL平臺並創建一個上下文

在這裏插入圖片描述
在這裏插入圖片描述

選擇設備並創建命令隊列

在這裏插入圖片描述
在這裏插入圖片描述

創建和構建程序對象

在這裏插入圖片描述
在這裏插入圖片描述

執行內核

在這裏插入圖片描述
在這裏插入圖片描述

cl_context context = 0;
cl_command_queue commandQueue = 0;
cl_program program = 0;
cl_device_id device = 0;
cl_kernel kernel = 0;
cl_mem memObjects[3] = { 0, 0, 0};
cl_int errNum;

// 創建OpenCL上下文
context = CreateContext(&device);
//獲得OpenCL設備,並創建命令隊列
commandQueue = CreateCommandQueue(context, device);
// 創建OpenCL程序
program = CreateProgram(context, device, "device.cl");
// 創建OpenCL內核
kernel = clCreateKernel(program, "vector_add", NULL);
// 創建OpenCL內存對象
float result[ARRAY_SIZE];
float a[ARRAY_SIZE];
float b[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; i++)
{
	a[i] = (float)i;
	b[i] = (float)(i * 2);
} 
if (!CreateMemObjects(context, memObjects, a, b))
{
	return 1;
}
// 設置內核參數
errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObjects[0]);
errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObjects[1]);
errNum |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObjects[2]);
if (errNum != CL_SUCCESS)
{
	return 1;
}
// 執行內核
size_t gloabalWorkSize = ARRAY_SIZE;
 size_t localWorkSize = 1;
 std::cout << "GPU 運行開始:" << time_stamp() << std::endl;
 errNum = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL, &gloabalWorkSize, &localWorkSize, 0, NULL, NULL);
 std::cout << "GPU 運行結束:" << time_stamp() << std::endl;
//計算結果拷貝回主機
errNum = clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE, 0, sizeof(float) * ARRAY_SIZE, result, 0, NULL, NULL);
for (int i = 0; i < ARRAY_SIZE; i++)
 {
  printf("i = %d:%f\n",i,result[i]);
 }
————————————————
版權聲明:本文爲CSDN博主「肥叔菌」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/asmartkiller/article/details/86611145

檢查OpenCL中的錯誤

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章