gpt4 book ai didi

algorithm - 使用 OpenCL 的迭代算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:09 25 4
gpt4 key购买 nike

我尝试实现一个简单的算法来准备一个更复杂的算法。我想多次调用一个内核,它会在每次调用中将数组中的每个值递增,比如说 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(
context,
CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * (nparticle*4),
pos2g,
&status);

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

for(int i=0; i

然后我设置内核参数并通过以下方式调用它:

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

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

非常感谢!迈克尔

最佳答案

在主机端:

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;
}

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

关于algorithm - 使用 OpenCL 的迭代算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25841854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com