Macos 是否知道opencl会生成损坏的代码?

Macos 是否知道opencl会生成损坏的代码?,macos,opengl,clang,opencl,llvm,Macos,Opengl,Clang,Opencl,Llvm,我有一个小的opencl内核,可以写入共享的GL纹理。我已经将计算的不同阶段划分为几个函数。每个函数都会获得一个指向最终颜色的指针,并在需要时传递该指针。如果您查看代码片段,您会看到一行名为“UNREACHABLE”。出于某种原因,它确实被执行了。我放进去的任何颜色都会出现在最终的图像中。这怎么可能 如果我复制下面相同的代码块,则不会发生这种情况。只有第一次( 为了让事情变得更有趣,如果我更改上面的代码(例如,添加另一个乘法),则无法访问的行将随机执行 因此,我的问题是:这是一个编译器错误吗?我

我有一个小的opencl内核,可以写入共享的GL纹理。我已经将计算的不同阶段划分为几个函数。每个函数都会获得一个指向最终颜色的指针,并在需要时传递该指针。如果您查看代码片段,您会看到一行名为“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);
}
void示例(float4*颜色){
...
float4 r_color=get_color(…);
浮动系数=r_color.w+(*color).w-1.0f;
r_color=r_color*((r_color.w-因子)/r_color.w);
*颜色+=r_颜色;
如果(颜色->w>=1.0f){

如果(color->w OpenCL编译器因为是软件而有缺陷:)在CPU和GPU设备上都尝试你的代码,看看会发生什么。CPU和GPU的行为相似。我想我发现了问题。get_color中的错误导致r_color.w始终为零。显然,将NaN与其他东西进行比较不是一个好主意。