OpenCL,向量类型的问题:叉积没有像我预期的那样工作

OpenCL, problem with vector types: cross product is not working as I expect

我是 OpenCL 以及大量并行计算的新手。我遇到了矢量类型操作的问题。 我非常喜欢利用 SIMD 指令对向量和矩阵进行运算。但问题是矢量类型,float float3 可能没有像我预期的那样工作...... 事情很简单我只需要让我的函数成为两个向量的叉积。

我已经在 Scala 中编写了该函数的版本并且运行良好。

这是 Scala 中的代码:

    @inline def crossProduct(other: Vector3D) = Vector3D(
        y * other.z - z * other.y,
        z * other.x - x * other.z,
        x * other.y - y * other.x)


这个是 OpenCL 版本,没有通过测试:

float3 cross_pro(float3 a, float3 b) {
    return (float3) (
        (a.y * b.z) - (a.z * b.y), 
        (a.z * b.x) - (a.x * b.z),
        (a.x * b.y) - (a.y * a.x));
}

给定的参数集:cross_pro((float3) (0, 1, 0), (float3) (1, 0, 0)); 在线计算器说结果必须是 (float3) (0, 0, -1) 但 OpenCL 版本打印:(float3) (0, 0, 0)! 我什至无法想象为什么会这样?所以我检查了这个函数的重载,试验了这些向量类型并做了很多其他的事情...

(a.x * b.y) - (a.y * a.x));

应该是

(a.x * b.y) - (a.y * b.x));

OpenCL 也已经有了叉积

https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/cross.html

float4 cross (float4 p0,float4 p1)
float3 cross (float3 p0,float3 p1)

double4 cross(double4 p0,double4 p1)   // if double extension enabled                               
double3 cross(double3 p0,double3 p1)   // if double extension enabled 

half4 cross(half4 p0,half4 p1)   // if half extension enabled                               
half3 cross(half3 p0,half3 p1)   // if half extension enabled 

Description

Returns the cross product of p0.xyz and p1.xyz. The w component of the float4 result (or double or half if the cl_khr_fp64 or cl_khr_fp16 extensions are enabled) will be 0.0.

如果您需要 CPU 的 SIMD 性能:我想,如果您使用它们的叉积函数定义,驱动程序将有效地处理任何可用的 CPU 叉积或点 product-like 函数.