Вызов функции ниже в скрипте из функции выше в скрипте

StackOverflow https://stackoverflow.com/questions/1383485

Вопрос

Я пытаюсь придумать способ заставить компьютер выполнять за меня некоторую работу.Я использую SIMD (SSE2 и SSE3) для расчета векторного произведения, и мне было интересно, можно ли это сделать быстрее.На данный момент у меня есть следующее:

const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y

__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
   // (y * other.z) - (z * other.y)
   // (z * other.x) - (x * other.z)
   // (x * other.y) - (y * other.x)

   return
   (
      _mm_sub_ps
      (
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
         ),
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
         )
      )
   );
}

Как видите, их четыре. _mm_shuffle_psтам, и я подумал, могу ли я заменить их комбинацией _mm_unpackhi_ps и _mm_unpacklo_ps которые возвращаются a2 a3 b2 b3 и a0 a1 b0 b1 соответственно и немного быстрее.

Я не мог понять это на бумаге, но я придумал решение.Что, если позволить компьютеру перебрать необходимые шаги?Просто рекурсивно просмотрите различные варианты и посмотрите, какой ответ дает правильный.

У меня это работает с умножением, оно возвращает это, когда я хочу, чтобы оно вернулось (3, 12, 27, 0):

startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)

Очень приятно, если я так говорю.

Однако, когда я захотел реализовать разделение, я наткнулся на проблему.Функция Multiply не просто должна вызывать функцию умножения, она также должна вызывать функцию деления.Хорошо, поэтому мы ставим деление выше умножения.Но деление не должно просто вызывать деление, оно также должно вызывать умножение, которое находится ниже в скрипте, поэтому его еще не существует.

Я начал с пустого консольного приложения на Visual C++ и поместил все в QuadTests.cpp.

Как мне убедиться, что эти две функции могут вызывать друг друга?

Заранее спасибо.

Это было полезно?

Решение

Просто чтобы подтвердить: ваша проблема в том, что функции, устроенные таким образом, не работают, потому что doStuff не объявлен к тому моменту, когда вы его вызываете getFoo:

int getFoo(int bar) {
    doStuff(bar + 1);
}

int doStuff(bar) {
    if (bar == 2) {
        return getFoo(bar);
    }

    return bar * 8;
}

Чтобы это исправить, нужно сделать форвардная декларация из int doStuff(int).Часто это делается с помощью заголовочного файла — в любом случае вам просто нужно добавить что-то вроде этого:

// #includes, etc. go here

int doStuff(int);
int getFoo(int);

// methods follow
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top