目錄
1基本信息編輯
2歷史發展編輯
3支持現狀編輯
4組織成員編輯
5使用介紹編輯
6框架組成編輯
OpenCL全景圖
- 參考資料
-
-
1.??圖形硬件處理標準 OpenCL ? .開源社區網 [引用日期2012-08-16] .
-
2.??Khronos OpenCL Registry? .Khronos [引用日期2014-03-8] .
-
3.??OpenCL框架組成?.CSDN [引用日期2013-01-8] .
-
- 1歷史
- 2示例
- 3參考文獻
- 4相關
- 5外部鏈接
- ^Khronos Launches Heterogeneous Computing Initiative, 新聞稿. Khronos Group. 2008-06-16 [2008-06-18].
- ^OpenCL gets touted in Texas. MacWorld. 2008-11-20[2009-06-12].
- ^The Khronos Group Releases OpenCL 1.0 Specification, 新聞稿. Khronos Group. 2008-12-08[2009-06-12].
- ^Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification, 新聞稿. Khronos Group. 2010-06-14[2010-10-13].
- ^OpenCL. SIGGRAPH2008. 2008-08-14[2008-08-14].
- ^Fitting FFT onto G80 Architecture (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008[2008-11-14].
- ^.OpenCL on FFT. Apple. 16 Nov 2009[2009-12-07].
- GPGPU
- CUDA
- DirectCompute
- 比特幣的挖礦
- 開源GPU社區(簡體中文)
OpenCL (Open Computing Language,開放計算語言) 是一個為異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成。OpenCL由一門用于編寫kernels (在OpenCL設備上運行的函數)的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務分區和數據分區的并行計算機制。
OpenCL類似于另外兩個開放的工業標準OpenGL和OpenAL,這兩個標準分別用于三維圖形和計算機音頻方面。OpenCL擴充了GPU圖形生成之外的能力。OpenCL由非盈利性技術組織Khronos Group掌管。
目錄
歷史
OpenCL最初蘋果公司開發,擁有其商標權,并在與AMD,IBM,英特爾和nVIDIA技術團隊的合作之下初步完善。隨后,蘋果將這一草案提交至Khronos Group。
2008年6月16日,Khronos的通用計算工作小組成立[1]。5個月后的2008年11月18日,該工作組完成了OpenCL 1.0規范的技術細節[2]。該技術規范在由Khronos成員進行審查之后,于2008年12月8日公開發表[3]。2010年6月14日,OpenCL 1.1 發布[4]。
示例
一個快速傅立葉變換的式子:[5]
// create a compute context with GPU devicecontext = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);// create a command queuequeue = clCreateCommandQueue(context, NULL, 0, NULL);// allocate the buffer memory objectsmemobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);// create the compute programprogram = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);// build the compute program executableclBuildProgram(program, 0, NULL, NULL, NULL, NULL);// create the compute kernelkernel = clCreateKernel(program, "fft1D_1024", NULL);// set the args valuesclSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);// create N-D range object with work-item dimensions and execute kernelglobal_work_size[0] = num_entries;local_work_size[0] = 64;clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
真正的運算: (基于 Fitting FFT onto the G80 Architecture)[6]
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into// calls to a radix 16 function, another radix 16 function and then a radix 4 function__kernel void fft1D_1024 (__global float2 *in, __global float2 *out,__local float *sMemx, __local float *sMemy) {int tid = get_local_id(0);int blockIdx = get_group_id(0) * 1024 + tid;float2 data[16];// starting index of data to/from global memoryin = in + blockIdx; out = out + blockIdx;globalLoads(data, in, 64); // coalesced global readsfftRadix16Pass(data); // in-place radix-16 passtwiddleFactorMul(data, tid, 1024, 0);// local shuffle using local memorylocalShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));fftRadix16Pass(data); // in-place radix-16 passtwiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplicationlocalShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));// four radix-4 function callsfftRadix4Pass(data); // radix-4 function number 1fftRadix4Pass(data + 4); // radix-4 function number 2fftRadix4Pass(data + 8); // radix-4 function number 3fftRadix4Pass(data + 12); // radix-4 function number 4// coalesced global writesglobalStores(data, out, 64);}
Apple的網站上可以發現傅立葉變換的例子[7]