OpenCL 构造函数语法和更新变量

OpenCL constructor syntax and updating variable

当我尝试更新 OpenCL 内核中的 float3 变量时,我得到了一些看似奇怪的结果。煮沸:

float3 vel = float3( 0 );   // a
vel = float3( 0, 1, 0 );    // b
vel = (float3)( 0, 2, 0 );  // c

如果我在每次调用后打印 vel

if( get_global_id( 0 ) == 0 )
    printf( "[%d]: vel: ( %f, %f, %f )\n", index, vel.x, vel.y, vel.z );

然后我看到 a) 正确地初始化了 vel,但是 b) 没有做任何事情。 c) 工作。有谁知道为什么我不能像在 b 中那样用新的 float3 对象更新变量?这就是我在 C++ 和 glsl 中习惯的做法。或者可能是驱动程序错误?

在 macbook pro 上使用 OpenCL 1.2 运行 OS X 10.11.5.

在 C 中,逗号运算符具有非常特定的语义,如详细描述here (or more briefly here):

(a, b, c) is a sequence of expressions, separated by commas, which evaluates to the last expression c

对于您的第二种方法 (b),这意味着您的表达式将归结为 float(0),这将得到与第一种方法 (a) 相同的结果.

您的第三种方法 (c) 是利用 OpenCL C 引入的特定语法,它允许初始化向量的各个元素,因此不会落入这个陷阱。

只有c)是initialising/using向量类型的正确方法。 a)b) 可能是 Mac 实现中的一个错误(在 2 个 GPU 和 1 个 CPU 上我试过没有编译)。

初始化向量类型的几种方法:

float3 vel = (float3)( 1,1,1 );
float3 vel2 = (float3) 1;  // it will be ( 1,1,1 )
float3 vel3 = 1;  // it will be ( 1,1,1 )

有关矢量类型用法的更多信息:spec