В настоящее время я разрабатываю фреймворк с открытым исходным кодом 3D С++ (с С++ 11), Моя собственная математическая библиотека построена как математическая библиотека также с SIMD. Но в настоящее время он не очень быстрый, и он имеет проблемы с выравниванием памяти, но больше об этом в другом вопросе.
Несколько дней назад я спросил себя, почему я должен написать свой собственный SSE. Компилятор также может генерировать высокий оптимизированный код, когда оптимизация включена. Я также могу использовать "векторное расширение "GCC. Но все это не очень портативно.
Я знаю, что у меня больше контроля, когда я использую свой собственный SSE-код, но часто этот элемент управления является unnessary.
Одной из больших проблем 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}; float v2 = {2, 0.5f, 0.25f, 4}; float res[4]; res[0] = v1[0]*v2[0]; res[1] = v1[1]*v2[1]; res[2] = v1[2]*v2[2]; res[3] = v1[3]*v2[3];
-
Или мне нужно использовать SIMD с дополнительным кодом? Как динамический класс контейнера с SIMD-операциями, для которого требуются дополнительные инструкции
load
иstore
.Pear3D::Vector4f* v1 = new Pear3D::Vector4f(0.5f, 2, 4, 0.25f); Pear3D::Vector4f* v2 = new Pear3D::Vector4f(2, 0.5f, 0.25f, 4); Pear3D::Vector4f res = Pear3D::Vector::multiplyElements(*v1, *v2);
В приведенном выше примере используется воображаемый класс с использованием
float[4]
internal и используетstore
иload
в каждом методе, напримерmultiplyElements(...)
. Методы используют внутренний SSE.
Я не хочу использовать другую библиотеку, потому что хочу узнать больше о SIMD и крупномасштабном программном обеспечении. Но примеры библиотек приветствуются.
PS: Это не проблема, а проблема дизайна.