62

特定のループをアンロールするように GCC に指示するにはどうすればよいですか? を使用して手動でループを展開できる CUDA SDK を使用し#pragma unrollました。gcc に同様の機能はありますか? 少しグーグルで検索しましたが、何も見つかりませんでした。

4

3 に答える 3

63

GCC には、これを処理するためのいくつかの異なる方法があります。

  • GCC docsに見られるように、 #pragma ディレクティブを使用します。プラグマにより、残りの関数の最適化がグローバルになることに注意してください。andマクロを巧みに使用した場合、次のように 1 つの関数だけでこれを定義できる可能性があります。#pragma GCC optimize ("string"...)#pragma push_optionspop_options

    #pragma GCC push_options
    #pragma GCC optimize ("unroll-loops")
    
    //add 5 to each element of the int array.
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
    
    #pragma GCC pop_options
    
  • 個々の関数にGCC の属性構文で注釈を付けます: GCC 関数属性のドキュメントで、この件に関するより詳細な論文を確認してください。例:

    //add 5 to each element of the int array.
    __attribute__((optimize("unroll-loops")))
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
    

注: GCC が逆反復ループをアンロールするのにどれほど優れているかはわかりません (Markdown を自分のコードでうまく動作させるために行いました)。ただし、例は正常にコンパイルされるはずです。

于 2013-01-10T05:44:49.863 に答える
4

-funroll-loops役立つかもしれません (ただし、ループごとではなくグローバルにループ展開をオンにします)。同じことをする必要があるかどうかはわかりません#pragma...

于 2010-11-01T18:07:07.600 に答える