OpenCL, проблема с векторными типами: перекрестный продукт не работает, как я ожидаю - PullRequest
0 голосов
/ 30 мая 2019

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

1 Ответ

3 голосов
/ 30 мая 2019
(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 

Описание

Возвращает перекрестное произведение p0.xyz и p1.xyz.Компонент w результата float4 (или удвоенный или наполовину, если включены расширения cl_khr_fp64 или cl_khr_fp16) будет равен 0.0.

Если вам нужна производительность ЦП для SIMD: я думаю, драйверы будут обрабатывать любыеэффективно использовать функции, связанные с несколькими продуктами ЦП или точечным продуктом, если вы используете их определение функций нескольких продуктов.

...