コード内に以下の構造があり、何度も使用されています。だから、コードの読みやすさを向上させ、行数を減らすためには、私は本当にその代わりにマクロを使う必要があります。私はそれのためのマクロを書くことを探していますパーツは以下の通りです:任意の計算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
は、私はあなたがそれを手動でアンロール(と複雑さと減少の増加に対応を確立するために、試験の公平なビットを行ってきたと推定マクロ – wasthishelpful
前に関数を記述するために考えてみましょう統計的に有意で価値のあるパフォーマンス上の利点がありますか? – EOF
@EOFそうですね! GPUカーネルのこの部分であり、パフォーマンスを向上させるために展開することを可能にするためにループサイズをコンパイラに知らせる必要があります。しかし、可読性は低下します:-(。 – Siamak