知道opencl会生成损坏的代码吗?

时间:2014-07-28 15:49:48

标签: macos opengl clang opencl llvm

我有一个小的opencl内核,可以写入共享的GL纹理。我已将计算的不同阶段分成几个函数。每个函数都会获得一个指向最终颜色的指针,并在需要时传递它。如果您查看代码片段,您会看到一条名为" UNREACHABLE"的行。由于某种原因,它确实被执行了。我放在那里的颜色出现在最终图像中。怎么可能?

如果我复制下面相同的代码块,那么就不会发生。仅适用于第一个。 :(

为了让事情变得更有趣,如果我更改上面的代码(例如添加另一个乘法),UNREACHABLE行将随机执行。

因此我的问题:这是编译器错误吗?我是否已经耗尽某些记忆或注册了我应该注意的内容? OpenCL编译器一般都有错误吗?

void sample(float4 *color) {
    ...
    float4 r_color = get_color(...);
    float factor = r_color.w + (*color).w - 1.0f;

    r_color = r_color * ((r_color.w - factor) / r_color.w);

    *color += r_color;
    if(color->w >= 1.0f) {
      if(color->w <= 0.0f) {
        (*color) = (float4)(0.0f, 0.0f, 0.0f, 1.0f); //UNREACHABLE?
        return;
      }
    }
    ...
}
...
__kernel void render(
    __write_only image2d_t output_buffer,
    int width,
    int height
) {
    uint screen_x = get_global_id(0);
    uint screen_y = get_global_id(1);

    float4 color = (float4)(0.0f, 0.0f, 0.0f, 0.0f);

    sample(&color);

    write_imagef(output_buffer, (int2)(screen_x, screen_y), color);
}

我的平台:

苹果

  • 英特尔(R)Core(TM)i5-2415M CPU @ 2.30GHz

选择装置具有扩展名:cl_APPLE_SetMemObjectDestructor cl_APPLE_ContextLoggingFunctions cl_APPLE_clut cl_APPLE_query_kernel_names cl_APPLE_gl_sharing cl_khr_gl_event cl_khr_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_3d_image_writes cl_khr_image2d_from_buffer cl_APPLE_fp64_basic_ops cl_APPLE_fixed_alpha_channel_orders cl_APPLE_biased_fixed_point_image_formats cl_APPLE_command_queue_priority

[编辑]

在观察计算过程中得到的值后,我认为在get_color之后r_color.w正好是0.0f可能导致问题。我仍然在寻找一个明确的陈述,即说明NaN没有定义或者总是正确的。

另外&#34; opencl是否会产生损坏的代码?&#34;有隐形的后缀&#34;或者我错过了什么&#34;。

我曾经使用嵌入式系统,供应商会提供他们自己的专有编译器,而这些编译器反过来又会破坏你的代码。所以如果可能的话,我想把它从桌子上拿下来。我怀疑clang不会这样做。但你永远不知道。

0 个答案:

没有答案