Оптимизированный код SSE работает аналогично простой версии
Я хотел сделать свои первые шаги с Intel SSE, поэтому я следовал опубликованному здесь руководству, с той разницей, что вместо разработки для Windows и C++ я делаю это для Linux и C (поэтому я не использую какие-либо _aligned_malloc
но posix_memalign
).
Я также реализовал один вычислительный метод без использования расширений SSE. Удивительно, но когда я запускаю программу, оба куска кода (тот, что с SSE, и тот, у кого нет) занимают одинаковое количество времени, обычно это время, когда один использует SSE немного выше, чем другой.
Это нормально? Возможно ли, что GCC уже оптимизирует с SSE (также используя -O0
вариант)? Я также попробовал -mfpmath=387
вариант, но никак, все тот же.
2 ответа
Для операций с плавающей запятой вы можете не увидеть огромных преимуществ с SSE. Большинство современных процессоров x86 имеют два FPU, поэтому двойная точность может быть примерно одинаковой для SIMD и скаляра, а одинарная точность может дать вам 2x для SIMD по сравнению со скаляром в хороший день. Тем не менее, для целочисленных операций, например, обработки изображений или аудио в 8 или 16 битах, вы все равно можете получить существенные преимущества с SSE.
GCC имеет очень хороший встроенный векторизатор кода (который iirc запускает при -O0 и выше), так что это означает, что он будет использовать SIMD в любом месте, где это возможно, для ускорения скалярного кода (он также немного оптимизирует SIMD-код тоже, если это возможно).
довольно легко подтвердить, что это действительно то, что здесь происходит, просто разберите вывод (или используйте gcc emit commed asm файлы).