多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > OpenCL之簡單的向量加法實現

OpenCL之簡單的向量加法實現

來源:程序員人生   發布時間:2015-06-19 08:52:30 閱讀次數:4511次

  • 向量加法
    • 程序流程
    • 創建平臺
    • 選擇裝備
    • 創建上下文
    • 創建命令隊列
    • 創建程序對象
    • 編譯程序
    • 開辟內存
    • 創建Kernel對象
    • 設置Kernel參數
    • 運行Kernel
    • 拷貝結果回主機
    • 釋放資源
    • 完全代碼
    • 效果截圖
  • Hello World
    • 代碼以下

向量加法

程序流程

OpenCL向量加法流程

創建平臺

//創建平臺對象
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视频 | 免费在线公开视频 |