использование ассемблером команд предварительной выборки - PullRequest
2 голосов
/ 28 января 2010

Я пишу некоторый (встроенный) встроенный код сборки, который работает с огромным массивом структур C в цикле и сохраняет некоторые данные в другом массиве.

процессор поддерживает команду предварительной выборки PLD.

если я получаю доступ к данным в последовательном порядке, есть ли прирост производительности, если я использую команду prefetch для загрузки startadress следующей структуры в массиве, прежде чем я начну обработку текущей? или я должен предварительно выбрать в каждой итерации следующую, кроме одной? или предварительно получить определенное количество байтов впереди?

имеет ли смысл предварительно выбирать адрес в массиве назначения?

спасибо!

1 Ответ

1 голос
/ 28 января 2010

Это сильно зависит от внутренней работы процессора. Возможно, предварительная выборка увеличит производительность, а может и нет, вам придется просмотреть документацию.

Производительность можно повысить, если для загрузки данных в процессор имеется отдельная субъединица, которая работает параллельно с вычислительной субъединицей. Также имейте в виду, что инструкция предварительной выборки - это еще одна инструкция, поэтому лучше выполнять ее только один раз для каждой длины блока строки кэша, не чаще, в противном случае вы просто увеличиваете нагрузку на процессор и теряете время. Если подразделение для загрузки данных не является отдельным, и вы по-прежнему используете команду предварительной выборки, вы можете даже столкнуться с падением производительности - без увеличения из-за отсутствия одновременной работы и большей загрузки процессора, что приводит к потере времени.

Вы не должны предварительно извлекать данные из массива, в который вы только записываете - это просто трата времени.

...