6

次のプログラムで 2 番目のループを選択的に展開しようとしています。

#include <stdio.h>

int main()
{
    int in[1000], out[1000]; 
    int i,j;

    #pragma nounroll
    for (i = 100; i < 1000; i++)
    {
       in[i]+= 10;
    }

    #pragma unroll 2
    for (j = 100; j < 1000; j++)
    {
       out[j]+= 10;
    }

    return 1;
}

次のオプションを指定して clang (3.5) を実行すると、両方のループが 4 回展開されます。

clang -std=c++11 -O3 -fno-slp-vectorize -fno-vectorize -mllvm -unroll-count=4 -mllvm -debug-pass=Arguments -emit-llvm -c *.cpp 

私は何を間違っていますか?また、フラグを追加-fno-unroll-loopsまたはスキップすると、-unroll-count=4ループが展開されません。

また、プラグマエラーをデバッグする方法に関するヒントはありますか?

4

2 に答える 2

6

そのようなプラグマは、clang 3.5 ではサポートされていないと思います。

ただし、3.6 以降では、 を使用#pragma clang loop unroll(enable | disable)して、自動診断ベースの展開機能を有効または無効にすることができます。ループを完全に展開したい場合、 then#pragma clang loop unroll(full)はその省略形です。#pragma clang loop unroll_count(N)また、( Nはコンパイル時の定数) を使用して、展開回数を明示的に指定することもできます。

詳細はこちら

上記のものに関して書き直されたコード:

#include <stdio.h>

int main()
{

  int in[1000], out[1000]; 
  int i,j;

  #pragma clang loop unroll(disable)
  for (i = 100; i < 1000; i++)
  {
     in[i]+= 10;
  }

  #pragma clang loop unroll_count(2)
  for (j = 100; j < 1000; j++)
  {
     out[j]+= 10;
  }


  return 1;
}
于 2016-04-07T18:40:05.227 に答える