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
当我尝试更新 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 expressionc
对于您的第二种方法 (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