【发布时间】:2016-04-17 09:46:44
【问题描述】:
我已经编写了一个内核,它应该什么都不做,除了向 float3 的每个组件添加一个:
__kernel void GetCellIndex(__global Particle* particles) {
int globalID = get_global_id(0);
particles[globalID].position.x += 1;
particles[globalID].position.y += 1;
particles[globalID].position.z += 1;
};
具有以下结构(在内核中)
typedef struct _Particle
{
cl_float3 position;
}Particle;
我的问题是,当我将粒子数组写入 GPU 时,每个组件都为零。这是必要的代码:
(Particle*) particles = new Particle[200];
for (int i = 0; i < 200; i++)
{
particles[i].position.x = 5f;
}
cl_Particles = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(Particle)*200, NULL, &err);
if (err != 0)
{
std::cout << "CreateBuffer does not work!" << std::endl;
system("Pause");
}
clEnqueueWriteBuffer(queue, cl_Particles, CL_TRUE, 0, sizeof(Particle) * 200, &particles, 0, NULL, NULL);
//init of kernel etc.
err = clSetKernelArg(kernel, 0, sizeof(Particle) * 200, &cl_Particles);
if (err != 0) {
std::cout << "Error: setKernelArg 0 does not work!" << std::endl;
system("Pause");
}
这是我在 CPU 上的结构:
typedef struct _Particle
{
cl_float4 position;
}Particle;
有人可以帮我解决这个问题吗? (任何线索都值得讨论......)
谢谢
【问题讨论】:
-
1) 也许 size of 给你指针的大小,2) 也许 cl_float3 需要在设备端替换为 cl_float4 因为驱动程序或硬件
标签: c struct kernel buffer opencl