本页使用了标题或全文手工转换

OpenCL

维基百科,自由的百科全书
跳转至: 导航搜索
OpenCL
原作者 苹果公司
開發者 Khronos Group
穩定版本 2.0 / 2013年9月18日(14個月前) (2013-09-18)
操作系统 跨平台
类型 API
许可协议 免版税
網站 www.khronos.org/opencl
www.khronos.org/webcl

OpenCLOpen Computing Language,开放计算语言)是一个为异构平台编写程序的框架,此异构平台可由CPUGPU或其他类型的处理器组成。OpenCL由一门用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。

OpenCL类似于另外两个开放的工业标准OpenGLOpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL擴充了GPU圖形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

历史[编辑]

OpenCL最初由苹果公司开发,拥有其商标权,并在与AMDIBM英特尔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 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]

參考文獻[编辑]

  1. ^ Khronos Launches Heterogeneous Computing Initiative, 新聞稿. Khronos Group. 2008-06-16 [2008-06-18]. 
  2. ^ OpenCL gets touted in Texas. MacWorld. 2008-11-20 [2009-06-12]. 
  3. ^ The Khronos Group Releases OpenCL 1.0 Specification, 新聞稿. Khronos Group. 2008-12-08 [2009-06-12]. 
  4. ^ Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification, 新聞稿. Khronos Group. 2010-06-14 [2010-10-13]. 
  5. ^ OpenCL. SIGGRAPH2008. 2008-08-14 [2008-08-14]. 
  6. ^ Fitting FFT onto G80 Architecture (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008 [2008-11-14]. 
  7. ^ . OpenCL on FFT. Apple. 16 Nov 2009 [2009-12-07]. 

相關[编辑]

外部連結[编辑]