В настоящее время я разрабатываю среду 3D-приложений с открытым исходным кодом в c++(с c++11). Моя собственная математическая библиотека разработана подобно математической библиотеке 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:Это не реальная проблема, а вопрос дизайна.