我有一个小的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);
}
我的平台:
苹果
选择装置具有扩展名: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不会这样做。但你永远不知道。