2016-08-05 12 views
-2

コード内に以下の構造があり、何度も使用されています。だから、コードの読みやすさを向上させ、行数を減らすためには、私は本当にその代わりにマクロを使う必要があります。私はそれのためのマクロを書くことを探していますパーツは以下の通りです:任意の計算XによってCUDAカーネル内で使用するCマクロの作成

#define _UNROLL_FACTOR_volIntGrad 32 
    int jj = 0; 
    for (; jj < (ngbSize - 32); jj += 32) { 
     int j = offset + jj; 
#pragma unroll 
     for (int k = 0; k < 32; k++){ 
     ... 
     arbitrary calculation 1 (depends on k) 
     ... 
     } 
     ... 
     arbitrary calculation 2 
     ... 
    } 

    for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/2)); jj+= (_UNROLL_FACTOR_volIntGrad/2)){ 
     int j = offset + jj; 
#pragma unroll 
     for (int k = 0; k < 16; k++){ 
     ... 
     arbitrary calculation 1 (depends on k) 
     ... 
     } 
     ... 
     arbitrary calculation 2 
     ... 
    } 

    for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/4)); jj+= (_UNROLL_FACTOR_volIntGrad/4)){ 
     int j = offset + jj; 
#pragma unroll 
     for (int k = 0; k < 8; k++){ 
     ... 
     arbitrary calculation 1 (depends on k) 
     ... 
     } 
     ... 
     arbitrary calculation 2 
     ... 
    } 

    for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/8)); jj+= (_UNROLL_FACTOR_volIntGrad/8)){ 
     int j = offset + jj; 

#pragma unroll 
     for (int k = 0; k < 4; k++){ 
     ... 
     arbitrary calculation 1 (depends on k) 
     ... 
     } 
     ... 
     arbitrary calculation 2 
     ... 
    } 

    for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/16)); jj+= (_UNROLL_FACTOR_volIntGrad/16)){ 
     int j = offset + jj; 
#pragma unroll 
     for (int k = 0; k < 2; k++){ 
     ... 
     arbitrary calculation 1 (depends on k) 
     ... 
     } 
     ... 
     arbitrary calculation 2 
     ... 
    } 
    for (; jj < ngbSize; jj++){ 
     int j = offset + jj; 
     ... 
     arbitrary calculation 3 
     ... 
    } 
} 

、私はマクロとは独立しており、機能によって機能が異なり、計算のセットを意味します。誰もが、上記の構造のサイズを減らすために、このマクロを書く方法を知っていますか?次のような例:C++で

__MACRO 
    arbitrary calculation 1 
    arbitrary calculation 2 
    arbitrary calculation 3 
__END 
+6

は、私はあなたがそれを手動でアンロール(と複雑さと減少の増加に対応を確立するために、試験の公平なビットを行ってきたと推定マクロ – wasthishelpful

+1

前に関数を記述するために考えてみましょう統計的に有意で価値のあるパフォーマンス上の利点がありますか? – EOF

+0

@EOFそうですね! GPUカーネルのこの部分であり、パフォーマンスを向上させるために展開することを可能にするためにループサイズをコンパイラに知らせる必要があります。しかし、可読性は低下します:-(。 – Siamak

答えて

1

が、主に警備員とプラットフォームの依存関係のための条件付きコンパイルを含める以外の何のためのマクロを使用するようにひんしゅくを買うされています。最善のことは、内部でリンクされ、メンテナンスの単一点を持つ静的定数を作成することです。これをファイルの先頭に置くことができます。

C++ 11を使用している場合は、実行しようとしているものに対してconstexprを使用できます。コンパイラは、あなたのステートメントがテキスト置換ではなく型を持っていることを知ります。これは本質的にCスタイルのマクロが行うものです。

constexprの目的は、コンパイル時に計算できる不変オブジェクトを作成することです。このオブジェクトは静的定数のようなものです。しかし、それらの優れた点は、静的関数を作成することができ、他の関数に依存する計算を行う場合に便利なことです。

ここconstexprの使用を参照してください: When should you use constexpr capability in C++11?

+2

'constexpr'がOPの特有の問題をどのように助けてくれるのか説明したいと思うかもしれません。そうしないと、問題に答えるように見えません。 – EOF

+0

@JessicaAboukasm残念ながら、OPが彼の心を変えました。これはC(実際はCUDA)の質問です:( – kfsone

+0

@kfsone CUDAのnvccコンパイラはC++の規則に従い、C++の準拠を主張しています。 –

関連する問題