現在、p_Nが5に定義されている場合、カーネルが解析されて出力されると、p_Nのすべてのインスタンスが5に置き換えられます。
#definesが生成されたソースコードに含まれ、p_Nなどのコンパイラ変数が生成されたソースコードに残されるように、パーサーオプションを追加すると便利です。
これにより、生成されたコードが非常に読みやすくなります。
残念ながら、コード変換を適用するには、すべての定義を拡張する必要があります
#define
の値は2か所にあります
> head ~/.occa/cache/c8141715ac4e4272/raw_source.cpp
#define block 256
/* The MIT License (MIT)
*
> cat ~/.occa/cache/c8141715ac4e4272/build.json | jq .kernel.props.defines
{
"block": 256
}
実際のループ境界を抽出するためにこれを行うことが有用であることに同意し、パーサーはこれを行うように設計されていると思います。 ただし、コード内の定義を保持することが不可能である可能性は低いようです。 値がどのように計算されるかを追跡することで、数値を印刷する必要がなくなります。
コードを維持して変換するのは見た目よりも難しい
定義は、部分的なコードであっても、何でもかまいません
#define foo 3 +
for (int i = 0; i < foo 5; ++i) {}
#define
行を保持すると、コンパイラーは引き続きプリプロセッサーを実行するため、問題が発生する可能性もあります。
...そしてDefineが単なる数値定数である場合...?
...そしてなぜそのために追加のロジックが必要なのですか....?
これは出力カーネルの例です
extern "C" __global__ void _occa_ellipticPreconCoarsenHex3D_0(const int Nelements,
const double * __restrict__ R,
const double * __restrict__ qf,
double * __restrict__ qc) {
{
int e = 0 + blockIdx.x;
__shared__ double s_qfff[8][8][8];
__shared__ double s_qcff[2][8][8];
__shared__ double s_qccf[2][2][8];
__shared__ double s_qccc[2][2][2];
__shared__ double s_R[2][8];
{
int k = 0 + threadIdx.z;
{
int j = 0 + threadIdx.y;
{
int i = 0 + threadIdx.x;
const int id = i + j * 8 + k * 8 * 8 + e * 512;
s_qfff[k][j][i] = qf[id];
if ((k == 0) && (j < 2)) {
s_R[j][i] = R[j * 8 + i];
}
}
}
}
カーネルは翻訳時に読みやすさを失っています。 これらの数字はすべて定義でした。
一歩後退して、機能リクエストの理由は
生成されたコードを非常に読みやすくします
生成されたコードは、ユーザー向けではなく、コンパイラー向けです(コンパイラーによる前処理された出力と同様)。 構文解析の問題がある場合、特にパーサーはまだ成熟していないため、調べるのに役立つ可能性があります。 ただし、これらの問題は時間の経過とともに整理する必要があります。
デバッグを容易にすることが目的の場合は、元のソースコードと一致するように#line
を追加する必要があることに同意します
私は、デバッグのためにこれが真のボーナスになることに同意します-いいアイデアです!
このリクエストの背後にある理由についてもっと明確にすべきでした。OCCA1.0の新しいコード生成ツールの重要なユースケースの1つは、OKLから非OCCAアプリケーションのネイティブスレッド言語へのトランスレーターとしてです。 その場合、生成されたCUDA / OpenCL / HIP / OpenMPコードはOKLコードから分離されるため、読みやすさを維持することが重要になります。
それは合理的に聞こえます
最初に追加する必要がある機能がいくつかあります
#define
ではなく、カーネルプロパティとして渡された数値定義からグローバル変数を作成します#defines
に対してそれを実行できるようにすることは、それらが定義されている場所と、変換後にどのスコープに接触するかを追跡する必要があるため、非常に困難です。parser::getExpression
の間に、 constexpr
をその値に置き換えますconst
変数のみconstexpr
関数に展開#define
行を先頭に追加し直します機能リクエストをご検討いただきありがとうございます。
最も参考になるコメント
それは合理的に聞こえます
最初に追加する必要がある機能がいくつかあります
#define
ではなく、カーネルプロパティとして渡された数値定義からグローバル変数を作成します#defines
に対してそれを実行できるようにすることは、それらが定義されている場所と、変換後にどのスコープに接触するかを追跡する必要があるため、非常に困難です。parser::getExpression
の間に、constexpr
をその値に置き換えますconst
変数のみconstexpr
関数に展開#define
行を先頭に追加し直します