Может ли компилятор C предварительно извлекать данные вокруг вызова? - PullRequest
1 голос
/ 25 ноября 2010

Возможно ли хорошему компилятору C с высокой оптимизацией включить оптимизировать код с помощью предварительных выборок и размещать предварительные выборки перед вызовом некоторой функции:

struct *abc;
//...

function_first(&(abc->field1));
abc->field2= abc->field3+ abc->field4 + abc->field5 + ...; 
// a lot work on struct fields
function_second(&(abc->field1))

Таким образом, можно выполнить код после оптимизации компилятора, чтобы иметь предварительные выборки для полей abc и переместить его выше, чем вызов function_first(), например:

struct *abc;
//...

__prefetch(abc->field2);__prefetch(abc->field5);
function_first(&(abc->field1));
abc->field2= abc->field3+ abc->field4 + abc->field5 + ...; 
// a lot work on struct fields
function_second(&(abc->field1))

Функция function_first() может быть аннотирована как clean (не имеет побочных эффектов для полей abc, кроме field1), или программа может быть скомпилирована при оптимизации всей программы (-ipo / Qipo для intel), где Компилятор может проверить, что function_first делает.

ОБНОВЛЕНИЕ: без вызовов возможны предварительные выборки, но этот вопрос касается смешивания вызовов и предварительных выборок

Спасибо.

1 Ответ

1 голос
/ 25 ноября 2010

Да, компилятор Intel ICC может сделать это (*).Это спорный вопрос, что на самом деле имеет ли какой-либо разницы в производительности, хотя.

(*) См -opt-упреждающей = п переключатель.

...