【问题标题】:How to make the Intel C Compiler (icc) vectorize basic blocks?如何使英特尔 C 编译器 (icc) 向量化基本块?
【发布时间】:2014-02-03 19:05:41
【问题描述】:

我目前正在使用 icc(版本 13.1.0.146)编译在英特尔至强融核协处理器上以本机模式运行的 C 程序。

考虑以下两个代码片段:

// fragment 1
array[pos]     += 1;
array[pos + 1] += 1;
array[pos + 2] += 1;
array[pos + 3] += 1;

// fragment 2
for (int i = 0; i < 4; ++i)
    array[i] += 1;

不幸的是,只有循环是自动矢量化的。但是,如果我为 x86 平台编译,icc 也会对“展开”版本进行矢量化。

在为 Xeon Phi 编译时,有没有办法告诉 icc 向量化基本块?

感谢任何帮助。提前致谢!

【问题讨论】:

    标签: vectorization icc


    【解决方案1】:

    您在这里寻找的转换是“循环物化”,它从基本块创建短运行循环(迭代次数)并且循环体非常小。因此,英特尔(R) 至强融核(TM) 协处理器上的矢量化通常不是很好的候选对象。这是因为我们希望循环体中的工作量很大,这样创建向量操作数的开销不会显着影响循环的整体执行时间。

    【讨论】:

    • 如果编译器由于工作量低而通常决定不对上述代码进行矢量化处理,我完全可以理解。但是,我不明白为什么循环(与“展开”版本完全相同!)是矢量化的,而展开版本却不是。但是,没关系,这个项目现在已经完成了;)
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2015-09-14
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多