Расщепление циклов
Расщепление циклов (loop distribution, loopfission, loop splitting…) прямо противоположно их объединению. К такому трюку прибегают в тех случаях, когда оптимизируемый цикл содержит слишком много данных. Ассоциативность кэш-памяти первого уровня у большинства x86-процессоров равна четырем, реже — восьми, а это значит, что каждая обрабатывая ячейка данных может претендовать лишь на одну из четырех (восьми) возможных кэш-линеек и если они к этому времени уже заняты ячейками остальных потоков, происходит их неизбежное вытеснение из кэша, многократно снижающее производительность.
Рассмотрим следующий пример:
for(j = 0; j < n; j++)
{
c[j] = 0;
for(i = 0; i<m; i++)
a[j][i] = a[j][i] + b[j][i] * c[j];
}