Occa: Permintaan fitur: tambahkan opsi untuk menghentikan pengurai untuk mengganti variabel yang ditentukan dengan nilainya

Dibuat pada 29 Jul 2018  ·  10Komentar  ·  Sumber: libocca/occa

Saat ini jika p_N didefinisikan ke 5 maka ketika kernel diurai dan output semua instance p_N diganti dengan 5.

Akan berguna untuk menambahkan opsi parser sehingga #defines disertakan dalam kode sumber yang dihasilkan, dan variabel kompiler seperti p_N dibiarkan dalam kode sumber yang dihasilkan.

Ini akan membuat kode yang dihasilkan lebih mudah dibaca.

feature parser

Komentar yang paling membantu

Kedengarannya masuk akal

Ada beberapa fitur yang perlu ditambahkan terlebih dahulu

  • Buat variabel global dari definisi numerik yang diteruskan sebagai properti kernel daripada #define

    • :warning: Mampu melakukannya untuk semua #defines terlalu sulit karena kita perlu melacak di mana mereka didefinisikan dan cakupan mana yang mereka sentuh setelah transformasi

  • [Fitur Baru] Selama parser::getExpression , gantikan constexpr dengan nilainya

    • Awalnya hanya variabel const

    • Perluas ke fungsi constexpr

  • Tambahkan kembali baris #define ke atas seperti biasa

Semua 10 komentar

Sayangnya semua definisi perlu diperluas untuk menerapkan transformasi kode
#define dapat ditemukan di dua tempat

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
}

Saya setuju bahwa berguna untuk melakukan ini untuk mengekstrak batas loop yang sebenarnya dan saya membayangkan parser dirancang untuk melakukan ini. Namun, tampaknya tidak mungkin mempertahankan definisi dalam kode. Melacak bagaimana nilai dihitung akan meniadakan kebutuhan untuk mencetak nilai numeriknya.

Lebih sulit daripada mempertahankan kode dan mengubahnya
Mendefinisikan bisa apa saja, bahkan kode parsial

#define foo 3 +

for (int i = 0; i < foo 5; ++i) {}

Menjaga baris #define juga dapat menyebabkan masalah karena kompilator akan tetap menjalankan praprosesor

... dan jika Define hanyalah sebuah konstanta numerik... ?

... dan mengapa kita membutuhkan logika ekstra untuk itu ....?

Ini adalah contoh dari kernel keluaran

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];
          }
        }
      }
    }

Kernel kehilangan keterbacaan pada terjemahan. Semua angka ini adalah Definisi.

Mengambil langkah mundur, alasan permintaan fitur adalah untuk

buat kode yang dihasilkan lebih mudah dibaca

Kode yang dihasilkan dimaksudkan untuk kompiler, bukan untuk pengguna (mirip dengan output yang telah diproses sebelumnya oleh kompiler). Jika ada masalah penguraian, khususnya karena pengurai belum matang, itu bisa membantu untuk melihat. Namun, masalah ini harus diselesaikan dari waktu ke waktu.

Jika tujuannya untuk memudahkan debug, saya setuju kita harus menambahkan #line agar sesuai dengan kode sumber aslinya

Saya setuju bahwa untuk men-debug ini akan menjadi bonus nyata - ide yang bagus!

Saya seharusnya lebih jelas tentang alasan di balik permintaan ini: satu kasus penggunaan penting yang saya bayangkan untuk alat pembuat kode baru di OCCA 1.0 adalah sebagai penerjemah dari OKL ke bahasa threading asli untuk aplikasi non-OCCA. Dalam hal ini, penting untuk menjaga keterbacaan karena kode CUDA/OpenCL/HIP/OpenMP yang dihasilkan akan dipisahkan dari kode OKL.

Kedengarannya masuk akal

Ada beberapa fitur yang perlu ditambahkan terlebih dahulu

  • Buat variabel global dari definisi numerik yang diteruskan sebagai properti kernel daripada #define

    • :warning: Mampu melakukannya untuk semua #defines terlalu sulit karena kita perlu melacak di mana mereka didefinisikan dan cakupan mana yang mereka sentuh setelah transformasi

  • [Fitur Baru] Selama parser::getExpression , gantikan constexpr dengan nilainya

    • Awalnya hanya variabel const

    • Perluas ke fungsi constexpr

  • Tambahkan kembali baris #define ke atas seperti biasa

Terima kasih telah mempertimbangkan permintaan fitur!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jeremylt picture jeremylt  ·  12Komentar

tcew picture tcew  ·  22Komentar

dmed256 picture dmed256  ·  4Komentar

amikstcyr picture amikstcyr  ·  11Komentar

awehrfritz picture awehrfritz  ·  7Komentar