我正在尝试为Mac编写一个使用OpenCL硬件加速的物理模拟器。现在,当我尝试使用OpenCL运行我的内核时,调试器在我的gcl_memcpy
行报告一个SIGABORT以从内核获得结果。
现在,我已经设法简化了代码并仍然得到了错误。这是我的准系统OpenCL内核仍然导致崩溃:
kernel void pointfield(global const float * points,
float posX, float posY,
global float * fieldsOut) {
size_t index = get_global_id(0);
float2 chargePosition = vload2(0, &points[index * 3]);
vstore2(chargePosition, 0, &fieldsOut[2 * index]);
}
这实际上只是加载一个二维向量,然后立即存储它。我知道你在想什么,但问题不是溢出错误。这个等效代码有效:
kernel void pointfield(global const float * points,
float posX, float posY,
global float * fieldsOut) {
size_t index = get_global_id(0);
fieldsOut[2 * index] = points[3 * index];
fieldsOut[2 * index + 1] = points[3 * index + 1];
}
EARTH上的矢量代码出了什么问题?
此外,似乎有必要,这是我如何创建OpenCL上下文的要点:
dispatch_queue_t queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU, NULL);
if (!queue) {
queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_CPU, NULL);
}
cl_device_id gpu = gcl_get_device_id_with_dispatch_queue(queue);
char name[128];
clGetDeviceInfo(gpu, CL_DEVICE_NAME, 128, name, NULL);
dispatch_sync(queue, ^{
cl_ndrange range = {
1,
{0, 0, 0},
{self.pointChargeCount, 0, 0},
0
};
pointfield_kernel(&range, (cl_float *)_pointCharges.clBuffer, point.x, point.y,
(cl_float *)_fieldValues.clBuffer);
[_fieldValues getCLBuffer]; // calls gcl_memcpy
});
如果我省略[_fieldValues getCLBuffer]
来电,则中止发生在dispatch_sync
来电而非gcl_memcpy
来电。