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 函数.
我是 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 函数.