C编译器可以在呼叫周围预取数据吗?

时间:2010-11-25 17:23:17

标签: c compiler-construction compiler-optimization prefetch

是否可以通过高优化启用优秀的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(对于除field1之外的abc字段没有副作用),或者程序可以在整个程序优化中编译(-ipo / Qipo for intel),编译器可以检查function_first做什么。

更新:没有电话预取是可能的,但这个问题是关于混合呼叫和预取

感谢。

1 个答案:

答案 0 :(得分:1)

是的,英特尔的ICC编译器可以做到这一点(*)。但它是否真的对性能产生任何影响仍存在争议。

(*)请参阅-opt-prefetch=n开关。