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 값은 두 κ³³μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

raw_source.cpp

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

/* The MIT License (MIT)
 *

λΉŒλ“œ.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 행을 μœ μ§€ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

... 그리고 μ •μ˜κ°€ 단지 숫자 μƒμˆ˜λΌλ©΄... ?

... 그리고 μ™œ μΆ”κ°€ 논리가 ν•„μš”ν•œκ°€μš” ....?

이것은 좜λ ₯ μ»€λ„μ˜ μ˜ˆμž…λ‹ˆλ‹€.

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 κ°€ μ•„λ‹Œ 컀널 μ†μ„±μœΌλ‘œ μ „λ‹¬λœ 수치 μ •μ˜μ—μ„œ μ „μ—­ λ³€μˆ˜ 생성

    • :warning: #defines λͺ¨λ‘μ— λŒ€ν•΄ μˆ˜ν–‰ν•  수 μžˆλ‹€λŠ” 것은 μ •μ˜λœ μœ„μΉ˜μ™€ λ³€ν™˜ ν›„ μ ‘μ΄‰ν•˜λŠ” λ²”μœ„λ₯Ό 좔적해야 ν•˜κΈ° λ•Œλ¬Έμ— λ„ˆλ¬΄ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

  • [μ‹ κ·œ κΈ°λŠ₯] parser::getExpression λ™μ•ˆ $ constexpr λ₯Ό ν•΄λ‹Ή κ°’μœΌλ‘œ λŒ€μ²΄

    • μ²˜μŒμ—λŠ” const λ³€μˆ˜λ§Œ

    • constexpr κΈ°λŠ₯으둜 ν™•μž₯

  • ν‰μ†Œμ²˜λŸΌ #define 쀄을 맨 μœ„μ— λ‹€μ‹œ μΆ”κ°€ν•©λ‹ˆλ‹€.

κΈ°λŠ₯ μš”μ²­μ„ κ³ λ €ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

awehrfritz picture awehrfritz  Β·  7μ½”λ©˜νŠΈ

tcew picture tcew  Β·  22μ½”λ©˜νŠΈ

dmed256 picture dmed256  Β·  4μ½”λ©˜νŠΈ

amikstcyr picture amikstcyr  Β·  11μ½”λ©˜νŠΈ

jeremylt picture jeremylt  Β·  12μ½”λ©˜νŠΈ