Предположим, что я должен написать вычислительную интенсивную функцию C или С++, которая имеет 2 массива в качестве входных данных и один массив в качестве вывода. Если вычисление использует 2 входных массива чаще, чем обновление выходного массива, я попаду в ситуацию, когда выходной массив редко кэшируется, потому что он выведен для извлечения 2 входных массивов.
Я хочу зарезервировать одну часть кэша для выходного массива и как-то принудительно обеспечить, чтобы эти строки не удалялись после их получения, , чтобы всегда записывать частичные результаты в кеше.
Update1(output[]) // Output gets cached
DoCompute1(input1[]); // Input 1 gets cached
DoCompute2(input2[]); // Input 2 gets cached
Update2(output[]); // Output is not in the cache anymore and has to get cached again
...
Я знаю, что существуют механизмы, помогающие выселению: clflush, clevict, _mm_clevict и т.д. Существуют ли какие-либо механизмы для противоположного?
Я думаю о трех возможных решениях:
- С помощью _mm_prefetch время от времени извлекать данные, если они были выселены. Однако это может привести к излишнему трафику плюс, что мне нужно быть очень осторожным, когда их вводить;
- Попытка выполнить обработку на небольших кусках данных. Однако это будет работать только в том случае, если проблема позволяет это;
- Отключение аппаратных префетов, где это возможно, чтобы уменьшить скорость нежелательных выселений.
Кроме этого, есть ли элегантное решение?