【问题标题】:Iterative Algorithm with OpenCL使用 OpenCL 的迭代算法
【发布时间】:2014-09-15 06:16:00
【问题描述】:

我尝试实现一个简单的算法来准备一个更复杂的算法。 我想多次调用内核,它会在每次调用中将数组中的每个值递增 5。

因此,当我最初拥有数组 [1,2,3,4] 时,我希望在第一次调用后使用 [6,7,8,9],在第二次调用后使用 [11,12,13,14],依此类推在。但我不明白如何配置我的缓冲区以及在这种情况下如何将我的缓冲区排入队列。我试图在本教程中定位: http://www.browndeertechnology.com/docs/BDT_OpenCL_Tutorial_NBody-rev3.html (这是我最终要实现的算法,并进行了一些修改) 但是那里使用的库隐藏了最重要的方面。

目前我使用以下方法创建缓冲区:

pos2g_buf = clCreateBuffer(
上下文,
CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * (nparticle*4),
pos2g,
&地位);

内核的调用被放置在一个for循环中

for(int i=0; 我

在那里我设置了内核参数并通过以下方式调用它:

  status = clEnqueueNDRangeKernel(                                                                                                                                    
      oclm->commandQueue,                                                                                                                              
                              kernel,                                                                                                                                    
                              NDRangeDimension,                                                                                                                                         
                              NULL,                                                                                                                                      
                              globalThreads,                                                                                                                             
                              localThreads,                                                                                                                              
                              0,                                                                                                                                         
                              NULL,                                                                                                                                      
                              &events[0]); // 

有人可以帮助我并给出正确的(伪)代码,如何创建我的简单迭代器程序?

提前非常感谢! 迈克尔

【问题讨论】:

    标签: algorithm opencl iteration


    【解决方案1】:

    在主机端:

    cl_mem buffer = clCreateBuffer(..., CL_MEM_READ_WRITE, ...);
    cl_kernel kernel = clCreateKernel(...);
    
    clSetKernelArg(.., kernel, buffer, ...);
    
    for(int i=0; i<num_laps; i++){
        clEnqueueNDRangeKernel(..., kernel, ...);
    }
    
    void *host_mem = malloc(...);
    clEnqueueReadBuffer(..., buffer, ..., host_mem, ...);
    

    在设备端:

    void __kernel my(global int* mem)
    {
        mem[get_global_id(0) += 5;
        return;
    }
    

    不要忘记检查返回码和释放资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2017-04-07
      • 2012-01-31
      相关资源
      最近更新 更多