Occa: ์ƒˆ๋กœ์šด ์ปค๋„ ํ•œ์ •์ž ๋งคํฌ๋กœ

์— ๋งŒ๋“  2020๋…„ 04์›” 02์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: libocca/occa

์Šค๋ ˆ๋“œ ๋ธ”๋ก(์ž‘์—… ๊ทธ๋ฃน)์˜ ์Šค๋ ˆ๋“œ(์ž‘์—… ํ•ญ๋ชฉ) ์ˆ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ปค๋„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข…์ข… ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HIP ์ปดํŒŒ์ผ๋Ÿฌ์— ์Šค๋ ˆ๋“œ ๋ธ”๋ก(์˜ˆ: 1024)์˜ ์Šค๋ ˆ๋“œ ์ˆ˜์— ๋Œ€ํ•œ ์ƒํ•œ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

__launch_bounds__(1024) __global__ void fooKernel(...) { ... }

์‹ค์ œ๋กœ ํ˜„์žฌ HIP ๋ฆด๋ฆฌ์Šค์˜ ๊ฒฝ์šฐ ๋ถˆํ–‰ํžˆ๋„ ์Šค๋ ˆ๋“œ ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ 256์„ ์ดˆ๊ณผํ•  ๋•Œ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(https://github.com/ROCm-Developer-Tools/HIP/issues/1310 ์ฐธ์กฐ).

CUDA๋„ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ์†Œ ์Šค๋ ˆ๋“œ ๋ธ”๋ก ์ˆ˜์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฒฝ๊ณ„ ํ•œ์ •์ž์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#launch-bounds).

OpenCL์˜ ์ปค๋„ ํ•œ์ •์ž๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(https://www.khronos.org/registry/OpenCL/specs/2.2/pdf/OpenCL_C.pdf์˜ 6.7.2 ์ฐธ์กฐ).

์ œ์•ˆ v1 - ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์Šค๋ ˆ๋“œ ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ OCCA๋Š” ์ ์ ˆํ•œ ์‹œ์ž‘ ๋ฒ”์œ„(CUDA, HIP) ๋˜๋Š” ์ž‘์—… ๊ทธ๋ฃน ํฌ๊ธฐ ํžŒํŠธ(OpenCL)์— ๋Œ€ํ•œ ์ปค๋„ ํ•œ์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Proposal v2 - Proposal v1์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์‹œ์ž‘ ๋ฒ”์œ„ @qualifier("innersizes", B)์— ๋Œ€ํ•œ okl ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊น”๋”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ B๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CUDA/HIP์˜ ๊ฒฝ์šฐ __launch_bounds__(๊ฐ’ B) ๋˜๋Š” OpenCL์˜ ๊ฒฝ์šฐ __attribute__((work_group_size_hint(๊ฐ’ B)))๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. Multi-dim ๋ณ€ํ˜•๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  22 ๋Œ“๊ธ€

์ด๊ฒƒ์€ HIP/CUDA/OpenCL์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋นŒ๋“œ ์†์„ฑ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

  addVectors = device.buildKernel("addVectors.okl",
                                  "addVectors",
                                  "launch_bounds: 1024");

์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”.

๋‚˜๋Š” ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๋‹ค. ๊ธฐ์—ฌํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. OCCA๋Š” JIT ์‹œ๊ฐ„์— ๋‚ด๋ถ€ ๋ฃจํ”„ ์น˜์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฃจํ”„ ์ฐจ์›์ด ์ปค๋„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งž๋Š” ๋ง์ด์ง€๋งŒ ์™œ ์œ ์šฉํ•œ์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. occa๊ฐ€ JIT ์‹œ๊ฐ„์— __launch_bounds__ ์†์„ฑ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ง€์ ์—์„œ ๋ฃจํ”„ ์น˜์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปค๋„ ์ธ์ˆ˜์™€ ์ง๊ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๋Š” ๋‚ด๋ถ€ ๋ฃจํ”„์˜ ํฌ๋ฏธํ•œ ๊ฐ’์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, JIT ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์Šค๋ ˆ๋“œ ๋ธ”๋ก ์น˜์ˆ˜๋ฅผ ์•Œ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์•„ ๋งž๋‹ค. @tcew ์ง€๊ธˆ ๋ฌด์Šจ ๋ง ํ•˜๋Š”์ง€ ์•Œ๊ฒ ์–ด์š”. ์ข‹์€ ์ง€์ .

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<strong i="6">@kernel</strong> void runtimeArgs(const int B,
                         const int T,
                         const int N,
                         const float *x,
                         const float *y,
                         float *xPy) {
  for (int b=0;b<B;++b;@outer(0)){
    for (int t=0;t<T;++t;@inner(0)){

      if(b==0 && t==0) printf("B=%d, T=%d\n", B, T);

      int  n = t + T*b;
      if(n<N){
        xPy[n] = x[n] + y[n];
      }
    }
  }
}

OCCA๋Š” ๋ถ„๋ช…ํžˆ JIT ์‹œ๊ฐ„์— ์ˆ˜์น˜ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์Šค๋ ˆ๋“œ ๊ทธ๋ฆฌ๋“œ์˜ ์น˜์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋Ÿฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

extern "C" void runtimeArgs(occa::modeKernel_t * *deviceKernel,
                            const int & B,
                            const int & T,
                            const int & N,
                            occa::modeMemory_t * x,
                            occa::modeMemory_t * y,
                            occa::modeMemory_t * xPy) {
  {
    occa::dim outer, inner;
    outer.dims = 1;
    inner.dims = 1;
    int b = 0;
    outer[0] = B - 0;
    int t = 0;
    inner[0] = T - 0;
    occa::kernel kernel(deviceKernel[0]);
    kernel.setRunDims(outer, inner);
    kernel(B, T, N, x, y, xPy);
  }
}

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฃจํ”„ ๊ฒฝ๊ณ„์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต์ฐจ ๊ฒŒ์‹œ๋ฌผ.

SYCL์€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

sycl::range<2> global_range(Bx*Tx,By*Ty);
sycl::range<2> local_range(Tx,Ty);
sycl::nd_range<2> kernel_range(global_range, local_range);

device_queue.submit([&](sycl::handler &cgh) {
    ...
  cgh.parallel_for(kernel_range, kernel);
});

(๋ฒ„ํผ์—๋Š” ์—ฐ๊ด€๋œ ๋ฒ”์œ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ N์„ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)

SYCL sycl::range ๊ตฌ๋ฌธ์€ OpenCL์—์„œ ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฉฐ ์ž์ฒด์ ์œผ๋กœ CUDA์—์„œ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์Šค๋ ˆ๋”ฉ ์น˜์ˆ˜์˜ ์‚ฌ์–‘์€ ๋ณ‘๋ ฌ for ๋ฃจํ”„์˜ ๋ณธ๋ฌธ๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

OCCA OKL ๊ตฌ๋ฌธ์€ ๋ฃจํ”„ ์ฐจ์›๊ณผ ๋ณธ๋ฌธ ์ฝ”๋“œ๋ฅผ ๋” ์นœ์ˆ™ํ•œ ๋ณ‘๋ ฌ for ๋ฃจํ”„ ๊ตฌ๋ฌธ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

for (int b=0;b<B;++b;@outer(0)){ /*  grid dimension defined here */
    for (int t=0;t<T;++t;@inner(0)){ /* thread block dimension defined here */

      if(b==0 && t==0) printf("B=%d, T=%d\n", B, T);

      int  n = t + T*b;
      if(n<N){
        xPy[n] = x[n] + y[n];
      }
    }
  }

์ปค๋„ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” ๋ณ‘๋ ฌ for ๋ฃจํ”„ ๊ฒฝ๊ณ„๋ฅผ ๋ณ‘๋ ฌ for ๋ฃจํ”„์˜ ๋ณธ๋ฌธ์— ๋งค์šฐ ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋Š” ์ž…๋ ฅ ๋ฐฐ์—ด์— ์˜ํ•ด ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์ธ ์ปค๋„์€ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๋งค์šฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

OKL ์ปค๋„ ๊ตฌ์„ฑ์€ ์‚ฌ๋žŒ๋“ค์„ ๊ต์œกํ•  ๋•Œ CUDA/OpenCL ์ปค๋„ ๊ตฌ๋ฌธ, ์ปค๋„ ์‹คํ–‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์ปค๋„ ์Šค๋ ˆ๋”ฉ ์ฒ ํ•™์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š” ์˜๋„์ ์ธ ์„ ํƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

SYCL์—๋Š” ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ ์ค‘์ธ CUDA/HIP์˜ __launch_bounds__ ์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ์Šค๋ ˆ๋“œ ๋ธ”๋ก ํฌ๊ธฐ ํžŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ข‹์€ ์งˆ๋ฌธ. ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด SYCL ํ‘œ์ค€(v1.2.1)์„ ๋‹ค์‹œ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. OpenCL C์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†์„ฑ์ด ์ง€์›๋˜๋ฉฐ cl ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C++ 11 ์†์„ฑ ์ง€์ •์ž์™€ ํ•จ๊ป˜ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด OpenCL C์˜ __attribute__(((reqd_work_group_size(n))) [[cl::reqd_work_group_size(n)]] ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. work_group_size_hint(n) ๋Š” ์†Œํ”„ํŠธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน ํฌ๊ธฐ๋Š” n ๊ฐ€ ๋  ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€๋งŒ req_work_group_size(n) ๋Š” ์—„๊ฒฉํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. .

OCCA์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜:

  1. occa::kernel ํด๋ž˜์Šค์— "innerDimHint" ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ CUDA/OpenCL/HIP์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ ๋”ค ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ (์•„์ง ํ•ด์‹œ์— ์—†๋Š” ๊ฒฝ์šฐ) ์žฌ์ปดํŒŒ์ผ์„ ๊ฐ•์ œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ƒˆ ์Šค๋ ˆ๋“œ ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ์žฌ์ปดํŒŒ์ผ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰๊ธฐ ๋‚ด๋ถ€์— ์ผ๋ถ€ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ผ๋ถ€ OCCA_ * ์ •์˜์— ์˜ํ•ด ์„ค์ •/ํ•ด์ œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋Ÿฐํƒ€์ž„์„ ์‹ ๋ขฐํ•˜๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ @dmed256 ์˜ ์›๋ž˜ ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์†Œํ’ˆ์œผ๋กœ ๋งŒ๋“  ๋‹ค์Œ ๋ฐฑ์—”๋“œ์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฒˆ์—ญ ์‹œ ์ปค๋„์— ๊ฐ๊ฐ์˜ __launch_bound__ ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

CUDA ๋ฐ HIP์˜ ๊ฒฝ์šฐ __launch_bound__ ๋Š” ์‹ค์ œ๋กœ ํžŒํŠธ์ผ ๋ฟ์ด๋ฏ€๋กœ OpenCL์˜ work_group_size_hint ์™€ ๋” ์œ ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ก์˜ ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฌ๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ ๋ฒ”์œ„๋ฅผ ์œ„๋ฐ˜ํ•˜๋”๋ผ๋„ ์ปค๋„์ด ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฅ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ ๋ฒ”์œ„๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์€ OCCA๊ฐ€ ์žก์•„์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ž๋™ ํŠœ๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ LDS ๋˜๋Š” REG๊ฐ€ ํ•„์š”ํ•œ OCCA:HIP ์ปค๋„์— ๋Œ€ํ•œ ๋ถ„ํ•  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” HIP๊ฐ€ ์žก์•„๋‚ผ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ๊ฒƒ์ด๋ผ๊ณ  ํšŒ์˜์ ์ด์—ˆ๋‹ค. ์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ํžŒํŠธ๋‚˜ ๋Ÿฐํƒ€์ž„์— ์ƒˆ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ์‹คํ–‰๊ธฐ๋กœ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” OKL ์ปค๋„ ์ฝ”๋“œ(์˜ˆ: ์™ธ๋ถ€์˜ ๊ฒฝ์šฐ K_blockDim , ๋‚ด๋ถ€์˜ ๊ฒฝ์šฐ K_threadDim )์—์„œ ๋งคํฌ๋กœ ์ƒ์ˆ˜ ๋Œ€์ฒด๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๋ช…์‹œ์ ์ธ ๋Ÿฐํƒ€์ž„ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŒ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„ ์†Œํ’ˆ์„ ํ†ตํ•ด ๋ฌผ๋ก  GPU์˜ ํŠน์„ฑ๊ณผ ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ์ž์ฒด API ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•  ๋ฃจํ”„ ๊ฒฝ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋™์  ๋ฌธ์ œ๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์ค‘์— JIT ์žฌ์ปดํŒŒ์ผ์ด ๊ฐ€๋” ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ž„๊ณ„๊ฐ’ ๋ณ€๊ฒฝ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋“œ๋ฌธ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ์‹ค์ œ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๊ฑฐ๋‚˜ ์ฃผ์–ด์ง„ ์ปค๋„์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ณตํ†ต ์„ธํŠธ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ JIT ์žฌ์ปดํŒŒ์ผ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์ปค๋„์— ๋Œ€ํ•ด ์‚ฌ์ „ ์ปดํŒŒ์ผ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์— ์ด๋Ÿฌํ•œ ๋ฃจํ”„ ๊ฒฝ๊ณ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด OKL ์ฝ”๋“œ์—์„œ GPU ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ํฌ๊ธฐ ์กฐ์ •์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://rocmdocs.amd.com/en/latest/Current_Release_Notes/Current-Release-Notes.html#performance -impact-for-kernel-launch-bound-attribute

์„œํˆฌ๋ฅธ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์‚ฌ๊ณผ์™€ ํ•จ๊ป˜ Np(>256) ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•œ libparanumal์˜ ์ปค๋„์— ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

occa::properties kernelInfo; 
...
 if(platform.device.mode()=="HIP"){
      char newflag[BUFSIZ];
      sprintf(newflag, " --gpu-max-threads-per-block=%d", mesh.Np);
      kernelInfo["compiler_flags"] += newflag;
    }

์‹œ์ž‘ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด hipcc ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Noel Chalmers์— ์˜ํ•ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒด์ ์ธ ๊ตฌํ˜„์€ ๋‚ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ปค๋„์ด ์ตœ๋Œ€ ๊ฒฝ๊ณ„๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ถˆ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์ ์ ˆํ•œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปค๋„์— ๋Œ€ํ•ด occa::properties ๊ฐœ์ฒด์˜ ๋ณ„๋„ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์‹œ์ž‘ ๋ฒ”์œ„๋ฅผ ์œ„๋ฐ˜ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰