0

循环语句有两种,例如:

for(int i=0;i<1000;i++)
 for (int j=0;j<1000;j++)
{
  for(int k=i*5;k<i*5+5;k++)
   for(int l=j*5;l<j*5+5;j++)
  {
   marrytemp=A[i]+B[j]+marry;
  }  
 marry[i,j]=marrytemp;
}

我如何在opencl内核中编写它?

4

1 回答 1

0

编写内核来处理内部的两个循环 (k,l),然后将其作为全局大小为 i,j 的 2D 内核排队。

编辑以添加内核大纲:

内核将类似于以下内容:

__kernel void innerLoop(__global float* A, __global float* B, __global float* marry)
{
    int i = get_global_id(1);
    int j = get_global_id(0);
    int marraytemp = 0;
    for(int k=i*5;k<i*5+5;k++)
    {
        for(int l=j*5;l<j*5+5;j++)
        {
            marrytemp=A[i]+B[j]+marrytemp;
        }  
    }
    marry[i,j]=marrytemp;
}

然后它会被称为:

clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&A);
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&B);
clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&marray);

size_t global_item_size[] = {100, 100};
clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, &global_item_size, NULL, 0, NULL, NULL);

这两个都需要额外的支持代码(例如创建command_queuekernel)并且没有被编译。它们只是为了让您了解如何将四个嵌套循环拆分为 OpenCL 内核。

于 2017-07-03T21:52:23.597 回答