1

私は3つの std::vector を持ち、それらをforループで使用している単純なプログラムを持っています。コンパイル フラグを有効にした後、これらのループが最適化されているかどうかをテストしています。しかし、ビジュアル スタジオは、理由 1200 によりループがベクトル化されていないことを示しています。私のサンプル コードは次のとおりです。

#include <iostream>
#include <vector>
#include <time.h>
int main(char *argv[], int argc)
{
    clock_t t=clock();
    int tempSize=100;
    std::vector<double> tempVec(tempSize);
    std::vector<double> tempVec1(tempSize);
    std::vector<double> tempVec2(tempSize);

    for(int i=0;i<tempSize;i++)
    {
        tempVec1[i] = 20;
        tempVec2[i] = 30;
    }

    for(int i=0,imax=tempSize;i<imax;i++)
        tempVec[i] = tempVec1[i] + tempVec2[i];

    t =clock()-t;          // stop the clock
    std::cout <<"Time in millisecs = " <<  t/double(CLOCKS_PER_SEC) <<      std::endl;
    return 0;
}

以下は、オプション「/Qvec-report:2」を有効にしてこのコードをコンパイルした結果です。

2> --- 関数の解析: main 2> d:\test\ssetestonvectors\main.cpp(12) : 情報 C5002: 理由 '1200' によりループがベクトル化されていません 2> d:\test\ssetestonvectors\main.cpp( 18) : 情報 C5002: ループは理由 '1200' によりベクトル化されませんでした

msdn ページでエラー コード 1200 について読んだとき: https://msdn.microsoft.com/en-us/library/jj658585.aspx エラー コード 1200 は、「ループにループを含むデータ依存が含まれている」ことが原因であると指定されています。

このループにそれがどのように含まれているのか理解できません。SSE2用に最適化できるように、Visual Studioの自動ベクトル化機能を使用できるように、最適化する必要があるある種のコードがあります。このコードにはベクトル演算が含まれています。ビジュアルスタジオがこのようなエラーコードを表示するたびに、私はそれを行うことができません.

4

2 に答える 2

2

自動ベクトル化は MSVC のかなり新しい機能であり、古いバージョンの MSVC を使用しています。だから完璧にはほど遠い。Microsoft はそれを知っているので、絶対に安全な場合にのみコードをベクトル化することにしました。

特定のエラー メッセージは少し簡潔です。実際には、「ループにはループ運搬データ依存が含まれる可能性があります」と表示されるはずです。MSVC はそれらが存在しないことを証明できないため、ベクトル化されません。

于 2016-10-17T06:56:17.997 に答える