目录
1基本信息编辑
2历史发展编辑
3支持现状编辑
4组织成员编辑
5使用介绍编辑
6框架组成编辑
-
参考资料
-
-
1. 图形硬件处理标准 OpenCL .开源社区网 [引用日期2012-08-16] .
-
2. Khronos OpenCL Registry .Khronos [引用日期2014-03-8] .
-
3. OpenCL框架组成 .CSDN [引用日期2013-01-8] .
-
- ^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].
- 开源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]。
示例
// create a compute context with GPU device context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL); // create a command queue queue = clCreateCommandQueue(context, NULL, 0, NULL); // allocate the buffer memory objects memobjs[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 program program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL); // build the compute program executable clBuildProgram(program, 0, NULL, NULL, NULL, NULL); // create the compute kernel kernel = clCreateKernel(program, "fft1D_1024", NULL); // set the args values clSetKernelArg(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 kernel global_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 memory in = in + blockIdx; out = out + blockIdx; globalLoads(data, in, 64); // coalesced global reads fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 1024, 0); // local shuffle using local memory localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4))); fftRadix16Pass(data); // in-place radix-16 pass twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15))); // four radix-4 function calls fftRadix4Pass(data); // radix-4 function number 1 fftRadix4Pass(data + 4); // radix-4 function number 2 fftRadix4Pass(data + 8); // radix-4 function number 3 fftRadix4Pass(data + 12); // radix-4 function number 4 // coalesced global writes globalStores(data, out, 64); }
Apple的网站上可以发现傅立叶变换的例子[7]