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

OpenCL构造函数语法和更新变量,opencl,Opencl,当我尝试更新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

当我尝试更新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中做的事情。或者可能是一个驱动程序错误


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

在C中,逗号运算符具有非常具体的语义,如详细(或更简短)所述:

(a,b,c)
是一个表达式序列,由逗号分隔,计算结果为最后一个表达式
c

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

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

c)
是初始化/使用向量类型的正确方法
a)
b)
可能是Mac实现中的一个bug(在我尝试过的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 )

关于向量类型用法的更多信息:

如果我可以补充一个问题:
float3(0,1,0)
归结为什么?FLUAT3不是一个类,没有构造函数,这不是C++…也包括案例a)?这是如何工作的?“DalkZoOS”当然不是标准的OpenCL C语法,所以很可能在任何地方(甚至在苹果以外的任何地方)都不起作用。虐待狂编译器作者甚至不警告C++风格的向量构造函数风格,默默地产生一个向量,所有的组件都被设置为最后指定的所有组件。ಠ_ಠ