Occa: 機能リクエスト:定義された変数をそれらの値に置き換えるためにパーサーを停止するオプションを追加します

作成日 2018年07月29日  ·  10コメント  ·  ソース: libocca/occa

現在、p_Nが5に定義されている場合、カーネルが解析されて出力されると、p_Nのすべてのインスタンスが5に置き換えられます。

#definesが生成されたソースコードに含まれ、p_Nなどのコンパイラ変数が生成されたソースコードに残されるように、パーサーオプションを追加すると便利です。

これにより、生成されたコードが非常に読みやすくなります。

feature parser

最も参考になるコメント

それは合理的に聞こえます

最初に追加する必要がある機能がいくつかあります

  • #defineではなく、カーネルプロパティとして渡された数値定義からグローバル変数を作成します

    • :warning:すべての#definesに対してそれを実行できるようにすることは、それらが定義されている場所と、変換後にどのスコープに接触するかを追跡する必要があるため、非常に困難です。

  • [新機能] parser::getExpressionの間に、 constexprをその値に置き換えます

    • 最初はconst変数のみ

    • constexpr関数に展開

  • 通常のように#define行を先頭に追加し直します

全てのコメント10件

残念ながら、コード変換を適用するには、すべての定義を拡張する必要があります
#defineの値は2か所にあります

raw_source.cpp

> head ~/.occa/cache/c8141715ac4e4272/raw_source.cpp 
#define  block 256

/* The MIT License (MIT)
 *

build.json

> 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ではなく、カーネルプロパティとして渡された数値定義からグローバル変数を作成します

    • :warning:すべての#definesに対してそれを実行できるようにすることは、それらが定義されている場所と、変換後にどのスコープに接触するかを追跡する必要があるため、非常に困難です。

  • [新機能] parser::getExpressionの間に、 constexprをその値に置き換えます

    • 最初はconst変数のみ

    • constexpr関数に展開

  • 通常のように#define行を先頭に追加し直します

機能リクエストをご検討いただきありがとうございます。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

jeremylt picture jeremylt  ·  12コメント

dmed256 picture dmed256  ·  4コメント

awehrfritz picture awehrfritz  ·  7コメント

tcew picture tcew  ·  22コメント

amikstcyr picture amikstcyr  ·  11コメント