Diferencia entre revisiones de «OpenCL»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Diegusjaimes (discusión · contribs.)
m Revertidos los cambios de 83.34.164.21 a la última edición de 193.145.249.213
Línea 68: Línea 68:
</source>
</source>


El cómputo en sí es este:
El cómputo en sí es éste:
<source lang="c">
<source lang="c">
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into

Revisión del 21:57 16 may 2009

OpenCL (Open Computing Language, Lenguaje de Computación Abierto) consta de una API y de un lenguaje de programación. Juntos permiten crear aplicaciones con paralelismo a nivel de datos y de tareas que pueden ejecutarse tanto en GPUs como CPUs. El lenguaje está basado en el C99, eliminando cierta funcionalidad y extendiéndolo con operaciones vectoriales.[1]

Apple creó la especificación original y la propuso al Grupo Khronos para convertirla en un estándar abierto y libre de royalties. El 16 de Junio de 2008 Khronos creó el Compute Working Group[2]​ para llevar a cabo el proceso de estandarización.

OpenCL formará parte de Mac OS X v10.6 ('Snow Leopard').[3]​. AMD ha decidido apoyar OpenCL en lugar de su antigua API Close to Metal. [4][5]

Ejemplo

Este ejemplo calcula una Transformada Rápida de Fourier[1]​. Las llamadas a la API son las siguientes:

// create a compute context with GPU device
context = clCreateContextFromType(CL_DEVICE_TYPE_GPU);

// create a work-queue
queue = clCreateWorkQueue(context, NULL, NULL, 0);

// allocate the buffer memory objects
memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA);
memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL);

// create the compute program
program = clCreateProgramFromSource(context, 1, &fft1D_1024_kernel_src, NULL);

// build the compute program executable
clBuildProgramExecutable(program, false, NULL, NULL);

// create the compute kernel
kernel = clCreateKernel(program, fft1D_1024);

// create N-D range object with work-item dimensions
global_work_size[0] = n;
local_work_size[0] = 64;
range = clCreateNDRangeContainer(context, 0, 1, global_work_size, local_work_size);

// set the args values
clSetKernelArg(kernel, 0, (void *)&memobjs[0], sizeof(cl_mem), NULL);
clSetKernelArg(kernel, 1, (void *)&memobjs[1], sizeof(cl_mem), NULL);
clSetKernelArg(kernel, 2, NULL, sizeof(float)*(local_work_size[0]+1)*16, NULL);
clSetKernelArg(kernel, 3, NULL, sizeof(float)*(local_work_size[0]+1)*16, NULL);

 // execute kernel
clExecuteKernel(queue, kernel, NULL, range, NULL, 0, NULL);

El cómputo en sí es éste:

// 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); fftRadix4Pass(data + 4); 
  fftRadix4Pass(data + 8); fftRadix4Pass(data + 12); 
  // coalesced global writes 
  globalStores(data, out, 64); 
}

Véase también

Referencias

  1. a b «OpenCL». SIGGRAPH2008. 14 de agosto de 2008. Consultado el 14 de agosto de 2008. 
  2. «Khronos Launches Heterogeneous Computing Initiative». Khronos Group. 16 de junio de 2008. Consultado el 18 de junio de 2008. 
  3. «Apple Previews Mac OS X Snow Leopard to Developers». Apple. 9 de junio de 2008. Consultado el 9 de junio de 2008. 
  4. «AMD Drives Adoption of Industry Standards in GPGPU Software Development». AMD. 6 de agosto de 2008. Consultado el 14 de agosto de 2008. 
  5. «AMD Backs OpenCL, Microsoft DirectX 11». eWeek. 6 de agosto de 2008. Consultado el 14 de agosto de 2008. 

Enlaces externos