Должен ли я использовать SIMD, векторные расширения или что-то еще?

В настоящее время я разрабатываю среду 3D-приложений с открытым исходным кодом в ). Моя собственная математическая библиотека разработана подобно математической библиотеке XNA, также с учетом SIMD. Но на данный момент он не очень быстрый, и у него есть проблемы с выравниванием памяти, но об этом в другом вопросе.

Несколько дней назад я спросил себя, почему я должен писать свой собственный код SSE. Компилятор также может генерировать высокооптимизированный код, когда оптимизация включена. Я также могу использовать «векторное расширение» из GCC. Но это все не очень портативно.

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

Одной из больших проблем SSE является использование динамической памяти, которая с помощью пулов памяти и дизайна, ориентированного на данные, максимально ограничена.

Теперь к моему вопросу:

  • Должен ли я использовать голый SSE? Возможно инкапсулированный.

    __m128 v1 = _mm_set_ps(0.5f, 2, 4, 0.25f);
    __m128 v2 = _mm_set_ps(2, 0,5f, 0,25f, 4);
    
    __m128 res = _mm_mul_ps (v1, v2);
    
  • Или компилятор должен делать грязную работу?

    float v1 = {0,5f, 2, 4, 0,25f};
    поплавок v2 = {2, 0,5f, 0.25ф, 4};
    число с плавающей запятой[4];
    разрешение[0] = v1[0]*v2[0];
    разрешение[1] = v1[1]*v2[1];
    разрешение[2] = v1[2]*v2[2];
    рез[3] = v1[3]*v2[3];
    
  • Или использовать SIMD с дополнительным кодом? Подобно классу динамического контейнера с SIMD-операциями, для которого требуются дополнительные инструкции loadи store.

    Pear3D::Vector4f* v1 = новый Pear3D::Vector4f(0.5f, 2, 4, 0.25f);
    Pear3D::Vector4f* v2 = новый Pear3D::Vector4f(2, 0.5f, 0.25f, 4);
    Pear3D::Vector4f res = Pear3D::Vector::multiplyElements(*v1, *v2);
    

    В приведенном выше примере используется воображаемый класс с использованием float[4]internal и использованием storeи loadв каждом методе, таком как multiElements(. ..). В методах используется внутренний SSE.

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

PS:Это не реальная проблема, а вопрос дизайна.

17
задан pearcoding 23 May 2012 в 15:56
поделиться