Search code examples
ccompiler-constructioncompiler-optimizationprefetch

Can C compiler prefetch data around the call?


Is it possible to good C compiler with high optimization enabled to optimize code with prefetches and to place prefetches before some function call:

struct *abc;
//...

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

So, can code after compiler optimization to have a prefetches for abc fields and move it higher than function_first() call, like this:

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))

The function function_first() can be annotated as clean (have no side-effects on abc fields other than field1), or the programm can be compiled in whole-program optimization (-ipo /Qipo for intel), where compiler can check, what function_first do.

UPDATE: without calls the prefetches are possible, but this question is about mixing calls and prefetches

Thanks.


Solution

  • Yes, Intel's ICC compiler can do this (*). It's debatable whether it actually makes any difference to performance though.

    (*) See the -opt-prefetch=n switch.