gpt4 book ai didi

c - 启用 for 循环的强制矢量化

转载 作者:行者123 更新时间:2023-11-30 14:47:06 25 4
gpt4 key购买 nike

我有一个循环,它位于一个并行构造中,如下所示

# pragma omp parallel ... //directives
{
// other loops ....
#pragma omp for
for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++)
{
p_sparse_s[i][j][k] = RLL[i][j][k] + (riri_sparse2 / noemer_sparse) * p_sparse_s[i][j][k];
}
// other loops ....
}

经检查,由于假定的依赖性,该循环似乎并未被矢量化。通过依赖性分析进一步检查,不存在依赖性(从代码中可以明显看出)。应如何更改指令以便告诉编译器强制执行矢量化?

附注如果我使用 ivdep 指令,那么编译器也不会向量化循环。

# pragma omp parallel ... //directives
{
// other loops ....
#pragma ivdep
#pragma omp for
for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++)
{
p_sparse_s[i][j][k] = RLL[i][j][k] + (riri_sparse2 / noemer_sparse) * p_sparse_s[i][j][k];
}
// other loops ....
}

最佳答案

ivdep 编译指示不会强制编译器对循环进行向量化,为了实现这一目标,应该使用simd 编译指示。

#pragma omp simd

就您而言,您只需将其附加到 for 中即可,如 #pragma omp for simd。请注意,建议您向 simd pragma 添加一些提示,例如您想要的向量化的特定类型(可以在此处找到可用的子句: https://software.intel.com/en-us/node/524530 )。

关于c - 启用 for 循环的强制矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51592692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com