νμ¬ p_Nμ΄ 5λ‘ μ μλλ©΄ 컀λμ΄ κ΅¬λ¬Έ λΆμλκ³ μΆλ ₯λ λ p_Nμ λͺ¨λ μΈμ€ν΄μ€κ° 5λ‘ λ체λ©λλ€.
#definesκ° μμ±λ μμ€ μ½λμ ν¬ν¨λκ³ p_Nκ³Ό κ°μ μ»΄νμΌλ¬ λ³μκ° μμ±λ μμ€ μ½λμ λ¨λλ‘ νμ μ΅μ μ μΆκ°νλ κ²μ΄ μ μ©ν κ²μ λλ€.
μ΄λ κ² νλ©΄ μμ±λ μ½λλ₯Ό ν¨μ¬ λ μ½κΈ° μ½κ² λ§λ€ μ μμ΅λλ€.
λΆννλ μ½λ λ³νμ μ μ©νλ €λ©΄ λͺ¨λ μ μλ₯Ό νμ₯ν΄μΌ ν©λλ€.
#define
κ°μ λ κ³³μμ μ°Ύμ μ μμ΅λλ€.
> 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
νμ μ μ§νλ©΄ λ¬Έμ κ° λ°μν μλ μμ΅λλ€.
... κ·Έλ¦¬κ³ μ μκ° λ¨μ§ μ«μ μμλΌλ©΄... ?
... κ·Έλ¦¬κ³ μ μΆκ° λ Όλ¦¬κ° νμνκ°μ ....?
μ΄κ²μ μΆλ ₯ 컀λμ μμ λλ€.
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
λ₯Ό μΆκ°ν΄μΌ νλ€λ λ° λμν©λλ€.
λλ²κΉ μ μν΄ μ΄κ²μ΄ μ§μ ν 보λμ€κ° λ κ²μ΄λΌλ λ° λμν©λλ€. μ’μ μκ°μ λλ€!
μ΄ μμ²μ μ΄μ μ λν΄ λ λͺ νν΄μΌ νμ΅λλ€. OCCA 1.0μ μλ‘μ΄ μ½λ μμ± λꡬμ λν΄ λ΄κ° ꡬμνλ μ€μν μ¬μ© μ¬λ‘ μ€ νλλ OKLμμ λΉ OCCA μμ© νλ‘κ·Έλ¨μ μν κΈ°λ³Έ μ€λ λ© μΈμ΄λ‘μ λ³νκΈ°μ λλ€. μ΄ κ²½μ° μμ±λ CUDA/OpenCL/HIP/OpenMP μ½λκ° OKL μ½λμμ λΆλ¦¬λλ―λ‘ κ°λ μ±μ μ μ§νλ κ²μ΄ μ€μν©λλ€.
ν©λ¦¬μ μΌλ‘ λ€λ¦¬λ€μ
λ¨Όμ μΆκ°ν΄μΌ ν λͺ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€.
#define
κ° μλ 컀λ μμ±μΌλ‘ μ λ¬λ μμΉ μ μμμ μ μ λ³μ μμ±#defines
λͺ¨λμ λν΄ μνν μ μλ€λ κ²μ μ μλ μμΉμ λ³ν ν μ μ΄νλ λ²μλ₯Ό μΆμ ν΄μΌ νκΈ° λλ¬Έμ λ무 μ΄λ ΅μ΅λλ€.parser::getExpression
λμ $ constexpr
λ₯Ό ν΄λΉ κ°μΌλ‘ λ체const
λ³μλ§constexpr
κΈ°λ₯μΌλ‘ νμ₯#define
μ€μ 맨 μμ λ€μ μΆκ°ν©λλ€.κΈ°λ₯ μμ²μ κ³ λ €ν΄μ£Όμ μ κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
ν©λ¦¬μ μΌλ‘ λ€λ¦¬λ€μ
λ¨Όμ μΆκ°ν΄μΌ ν λͺ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€.
#define
κ° μλ 컀λ μμ±μΌλ‘ μ λ¬λ μμΉ μ μμμ μ μ λ³μ μμ±#defines
λͺ¨λμ λν΄ μνν μ μλ€λ κ²μ μ μλ μμΉμ λ³ν ν μ μ΄νλ λ²μλ₯Ό μΆμ ν΄μΌ νκΈ° λλ¬Έμ λ무 μ΄λ ΅μ΅λλ€.parser::getExpression
λμ $constexpr
λ₯Ό ν΄λΉ κ°μΌλ‘ λ체const
λ³μλ§constexpr
κΈ°λ₯μΌλ‘ νμ₯#define
μ€μ 맨 μμ λ€μ μΆκ°ν©λλ€.