gpt4 book ai didi

c++ - OpenCL - 无法修改值

转载 作者:太空宇宙 更新时间:2023-11-04 13:22:20 26 4
gpt4 key购买 nike

我的问题是,我无法修改内核中的值。

这是不起作用的代码:

第一:内核:

__kernel void GetCellIndex(__global Particle* particles) {
int globalID = get_global_id(0);
particles[globalID].position.x = globalID;
};

第二:内核中使用的结构体:

typedef struct _Particle
{
float3 position;
}Particle;

第三:从 CPU 到 GPU 的插入:

(Particle*) particles = (Particle*)malloc(sizeof(Particle)*200);
for (int i = 0; i < 200; i++)
{
particles[i].position.x = 5f;
}

cl_mem cl_Particles = clCreateBuffer(context, CL_MEM_READ_WRITE |
CL_MEM_COPY_HOST_PTR, sizeof(Particle)*maxParticle, &particles[0], NULL);



//init of kernel etc.



err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&cl_Particles);
if (err != 0) {
std::cout << "Error: setKernelArg 0 does not work!" << std::endl;
system("Pause");
}

第四:运行内核:

size_t localItem = 1;
err = clEnqueueNDRangeKernel(queue, kernel, 1, 0, &(size_t)200+1, &localItem, 0, NULL, NULL);
if (err != 0) {
std::cout << "Error: EnqueueNDRange does not work!" << std::endl;
}

err = clFlush(queue);
if (err != 0) {
std::cout << "Error: Flush does not work: " << err << std::endl;
}

err = clFinish(queue);
if (err != 0) {
std::cout << "Error: Finish does not work: " << err << std::endl;
}

第五:GPU 上使用的结构体:

typedef struct _Particle
{
cl_float3 position;
}Particle;

6th:最后读取缓冲区:

clEnqueueReadBuffer(queue, cl_Particles, CL_TRUE, 0, 200 * sizeof(Particle), particles, 0, NULL, NULL);

在这一步之后,我的内核不会影响 clEnqueueReadBuffer 中返回的值...

有人知道为什么吗?这里有什么问题

最佳答案

解决了问题:

将 malloc 行更改为类似的内容

particles = new Particles[200];

还可以在单​​独的步骤中将数据写入缓冲区(使用 clEnqueueWriteBuffer(...))

其余的应该像上面的代码一样工作

关于c++ - OpenCL - 无法修改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725795/

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