Это зависит от того, насколько велики ваши массивы: если массивы сопоставимы или меньше, чем размер LLC, то вы наверняка получите некоторую выгоду, если будете делать что-то задом наперед, поскольку разумная часть данных последней обработки может находиться в кэше. (но это также осложняется новыми функциями LLC, которые пытаются обнаружить потоковые нагрузки и изменить политику замены кэша при их обнаружении). Более общий подход к этой работе - просто заблокировать вашу обработку: вместо того, чтобы выполнять каждый этап целиком, попробуйте чередовать ...

аюсь векторизовать цикл, вычисляя точечное произведение больших векторов с плавающей точкой. Я вычисляю это параллельно, используя тот факт, что CPU имеет большое количество регистров XMM, например:

__m128* A, B;
__m128 dot0, dot1, dot2, dot3 = _mm_set_ps1(0);
for(size_t i=0; i<1048576;i+=4) {
    dot0 = _mm_add_ps( dot0, _mm_mul_ps( A[i+0], B[i+0]);
    dot1 = _mm_add_ps( dot1, _mm_mul_ps( A[i+1], B[i+1]);
    dot2 = _mm_add_ps( dot2, _mm_mul_ps( A[i+2], B[i+2]);
    dot3 = _mm_add_ps( dot3, _mm_mul_ps( A[i+3], B[i+3]);
}
... // add dots, then shuffle/hadd result.

Я слышал, что использование инструкций предварительной выборки может помочь ускорить процесс, поскольку он может извлекать дополнительные данные «в фоновом режиме», при этом выполнять муллы и добавлять данные, находящиеся в кэше. Однако мне не удалось найти примеры и объяснения того, как использовать _mm_prefetch (), когда, с какими адресами и с какими попаданиями. Не могли бы вы помочь в этом?

Ответы на вопрос(1)

Ваш ответ на вопрос