OpenCL - 无法修改值
OpenCL - Can't modify values
我的问题是,我不能修改内核中的值。
这是不起作用的代码:
第一:内核:
__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;
第六:最后读取缓冲区:
clEnqueueReadBuffer(queue, cl_Particles, CL_TRUE, 0, 200 * sizeof(Particle), particles, 0, NULL, NULL);
经过这些步骤后,我的内核不会影响clEnqueueReadBuffer中返回的值。。。
有人知道为什么吗?这里的有什么问题
解决了问题:
将malloc行更改为类似的行
particles = new Particles[200];
也可以在单独的步骤中将数据写入缓冲区(使用clEnqueueWriteBuffer(...)
)
剩下的应该和上面的代码一样工作
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用std::vector的OpenCL矩阵乘法
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么可以修改数组 b?
- OpenCL - 无法修改值
- 编译器需要从OpenCL.lib中修改名称