为什么这个OpenCL内核不起作用?

时间:2013-11-28 01:38:39

标签: objective-c macos cocoa opencl physics-engine

我正在尝试为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来电。

0 个答案:

没有答案