代码之家  ›  专栏  ›  技术社区  ›  datapanda

启用for循环的强制矢量化

  •  0
  • datapanda  · 技术社区  · 6 年前

    我有一个循环,它在一个并行结构中,如下所示

    # 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 ....
    }
    

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

    P、 如果我使用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 ....
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Qubit    6 年前

    这个 ivdep pragma不强制编译器对循环进行矢量化,为了实现这个目的,应该使用 simd

    #pragma omp simd
    

    在您的例子中,您可以简单地将它附加到for #pragma omp for simd . 请注意,建议您在simd pragma中添加一些提示,例如您考虑的特定矢量化类型(可用的子句可以在此处找到: https://software.intel.com/en-us/node/524530