Я новичок в OpenCL , а также в тяжелых параллельных вычислениях.Я столкнулся с проблемой с операциями над векторными типами.Я без ума от использования инструкций SIMD для операций с векторами и матрицами.Но проблема в том, что векторные типы с плавающей точкой float3
могут работать не так, как я ожидал ... Все довольно просто, мне просто нужно сделать свою функцию равной произведению двух векторов.
I 'Вы написали версию этой функции в 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)
!Я даже не представляю, почему это происходит?поэтому я проверил эту функцию на перегрузку, поэкспериментировал с этими типами векторов и сделал много других вещей ...