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.
Sayangnya semua definisi perlu diperluas untuk menerapkan transformasi kode
#define
dapat ditemukan di dua tempat
> 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
}
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
#define
#defines
terlalu sulit karena kita perlu melacak di mana mereka didefinisikan dan cakupan mana yang mereka sentuh setelah transformasiparser::getExpression
, gantikan constexpr
dengan nilainyaconst
constexpr
#define
ke atas seperti biasaTerima kasih telah mempertimbangkan permintaan fitur!
Komentar yang paling membantu
Kedengarannya masuk akal
Ada beberapa fitur yang perlu ditambahkan terlebih dahulu
#define
#defines
terlalu sulit karena kita perlu melacak di mana mereka didefinisikan dan cakupan mana yang mereka sentuh setelah transformasiparser::getExpression
, gantikanconstexpr
dengan nilainyaconst
constexpr
#define
ke atas seperti biasa