Не могу молчать:
Есть такие вот "ассемблерные" макросы:
- _mm_store_ps(указатель, XMM-регистр) - писать в память.
- _mm_stream_ps(те же параметры) - писать в память мимо кэша.
Для первого из них генерируется инструкция movaps (Intel C++ в некоторых условиях генерирует movntps, чему я удивлялся всегда). Для второго - всегда movntps ("писать мимо кэша"). В теории, при обработке больших потоков данных вторая быстрее.
Я неопытный сварщик SSE-ассемблером занялся не так давно, на рабочей станции был уже Core I7 и на Core2 я свои изделия (которые пока для internal use) - не запускал почти. А тут - запустил. Удивился тормозам. Помикробенчмаркал. На коротком цикле, вроде поминаемых тут скалярных умножений, получил разницу в четыре раза.
В том смысле, что movntps - в 4 раза медленнее. 40 мегапикселей вместо 160. Устойчиво, от компилятора не зависит, и на gcc так и на Clang.
В-принципе, от mm_stream выигрыша большого на i7 не было. Похоже, лучше про нее вообще забыть.