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

时间:2016-06-27 07:28:23

标签: 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, vel.y, vel.z );

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

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

2 个答案:

答案 0 :(得分:3)

只有c)是初始化/使用矢量类型的正确方法。 a)b)可能是Mac实施中的一个错误(在我试过的2个GPU和1CPU上没有编译)。

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

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

答案 1 :(得分:2)

在C中,逗号运算符具有非常特定的语义,详细描述为here(或更简要地here):

  

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

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

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