Numpy: NumPy์—์„œ BLIS ์ง€์›์— ๋Œ€ํ•œ ์ถ”์ ๊ธฐ ๋ฌธ์ œ

์— ๋งŒ๋“  2016๋…„ 03์›” 02์ผ  ยท  97์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

๋‹ค์Œ์€ NumPy์—์„œ BLIS ์ง€์›์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ์ถ”์ ๊ธฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋ช…๋ชฉ์ƒ ๋ฌด๊ด€ ํ•œ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ด์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–ฅํ›„ ํ† ๋ก ์„ ํ†ตํ•ฉํ•˜๊ธฐ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. :-)

๊ฐ•์กฐํ•ด์•ผ ํ•  ํ˜„์žฌ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ :

CC : @tkelman @ matthew-brett @fgvanzee

15 - Discussion build

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

MSVC ABI๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” clang.exe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Windows์— BLIS๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ์—ฌ๊ธฐ ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๋Š” OpenBLAS์— ๋น„ํ•ด ๋†€๋ž๋„๋ก ์ ์—ˆ์Šต๋‹ˆ๋‹ค.
๋กœ๊ทธ๋Š” ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค . ๋ชจ๋“  BLIS ๋ฐ BLAS ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

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

BLIS๊ฐ€ site.cfg ์— ํฌํ•จ ๋œ ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
libFLAME ๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://www.cs.utexas.edu/%7Eflame/web/libFLAME.html ์˜ ์„ค๋ช…์€ ์ˆ˜์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ libFLAME์ด ์‹ค์ œ๋กœ LAPACK API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rgommers libflame์€ ์‹ค์ œ๋กœ netlib LAPACK API๋ฅผ ์ œ๊ณตํ•˜๊ณ  libflame์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

FWIW, BLIS๋Š” ์ด๋ฒˆ ํ˜ธ๊ฐ€ ์—ด๋ฆฐ ์ด๋ž˜๋กœ ํฐ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, BLIS๋Š” ์ด์ œ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ตฌ์„ฑ ์‹œ๊ฐ„ ๊ตฌ์„ฑ์ด ๋Ÿฐํƒ€์ž„ ์ธํ”„๋ผ ์ธก๋ฉด์—์„œ ๋‹ค์‹œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BLIS๋Š” ์ด์ œ๋ณด๋‹ค ํฌ๊ด„์  ์ธ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์™ธ์—๋„ ํ†ตํ•ฉ ๋œ BLAS ํ…Œ์ŠคํŠธ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ ๋†€๋ฆฌ ์‹ ํ—ค๋” ์ƒ์„ฑ (500 ๊ฐœ ์ด์ƒ์˜ ๊ฐœ๋ฐœ ํ—ค๋” ๋Œ€์‹  ๋‹จ์ผ blis.h)๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด ์ดˆ๊ธฐํ™”๋„ ์ ์šฉ๋˜์–ด ์„ค์น˜๋œ ์ œํ’ˆ์„ ๋” ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •์  ๋ฐ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ์— ๋Œ€ํ•ด๋ณด๋‹ค ํ‘œ์ค€ํ™” ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„ ์ง€์ • ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ soname ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋นŒ๋“œ ์‹œ์Šคํ…œ์€ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ ํ˜ธํ™˜์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์ œ ๋จธ๋ฆฌ ์œ„์—์„œ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@fgvanzee ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‚˜๋Š” numpy.distutils ์— ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด +1์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋ถ€์กฑํ•ด์„œ ์ ์–ด๋„ 9 ์›”๊นŒ์ง€๋Š” ์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (gh-7294์™€ ๊ฐ™์€ ์ค„์„ ๋”ฐ๋ผ). ๋ฌธ์ œ ํ•ด๊ฒฐ / ๊ฒ€ํ† ๋ฅผ ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํฐ ์ง„์ „์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. numpy / scipy (์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ ์ธก๋ฉด)์— ๋Œ€ํ•ด OpenBLAS์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด๋˜๊ธฐ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฝ๋‹ˆ๊นŒ?

(Fortran ์—‰๋ง์œผ๋กœ ์ธํ•ด Windows์— conda ์— ๋Œ€ํ•œ scipy-openblas๊ฐ€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค : https://github.com/conda-forge/scipy-feedstock/blob/master/recipe/ meta.yaml # L14)

MSVC ABI ํ˜ธํ™˜ BLAS ๋ฐ LAPACK์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์‰ฌ์šด ์™„์ „ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” clang-cl๊ณผ flang์ด ์กด์žฌํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์˜ˆ์ „๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ€์šฉ์„ฑ์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์œ ์—ฐ์„ฑ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ์ด์ „์— ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ง€์› ํ•œ ์ ์ด์—†๋Š” ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ https://github.com/flame/blis/issues/57#issuecomment -284614032

@rgommers BLIS๋Š” ํ˜„์žฌ OpenBLAS์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. AMD๊ฐ€ ACML์„ ํฌ๊ธฐํ•˜๊ณ  BLIS๋ฅผ ์ƒˆ๋กœ์šด ์˜คํ”ˆ ์†Œ์Šค ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†”๋ฃจ์…˜์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์™„์ „ํžˆ ์ˆ˜์šฉ ํ•œ ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ๊ธฐ์—… ํ›„์›์ž๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ณผ๊ฑฐ ์ˆ˜๋…„ ๋™์•ˆ ๊ตญ๋ฆฝ ๊ณผํ•™ ์žฌ๋‹จ์˜ ํ›„์›์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.)

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์ •ํ™•ํ•œ ํŠน์„ฑํ™”๋Š”๋ณด๊ณ ์žˆ๋Š” ์ž‘์—…, ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐ์ดํ„ฐ ์œ ํ˜•, ํ•˜๋“œ์›จ์–ด ๋ฐ ๊ด€์‹ฌ์žˆ๋Š” ๋ฌธ์ œ ํฌ๊ธฐ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ BLIS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ OpenBLAS๋ฅผ ์ถฉ์กฑํ•˜๊ฑฐ๋‚˜ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ ํฌ๊ธฐ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ค€ 3 ์„ฑ๋Šฅ (300 ๊ฐœ ๋ฏธ๋งŒ). ๋˜ํ•œ OpenBLAS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์œ ์—ฐํ•œ ๋ ˆ๋ฒจ 3 ๋ณ‘๋ ฌํ™” ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (๋ชจ ๋†€๋ฆฌ ์‹ ์–ด์…ˆ๋ธ”๋ฆฌ ์ปค๋„ ์„ค๊ณ„๋กœ ์ธํ•ด).

์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ BLIS๊ฐ€ ์ƒ๋‹นํžˆ ์•ˆ์ •์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์— ๋งค์šฐ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ง€๋‚œ 5 ๊ฐœ์›” ๋™์•ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ๊ธ‰์ฆํ•œ ๋•๋ถ„์— ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (๋Œ€๋ถ€๋ถ„ ๋นŒ๋“œ ์‹œ์Šคํ…œ ๊ด€๋ จ). ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ข… ์‚ฌ์šฉ์ž์™€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์›ํ™œ ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ BLIS๋Š” (0 ์ผ์งธ๋ถ€ํ„ฐ) BLAS์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์„ ์ œ๊ณตํ–ˆ์œผ๋ฉฐ BLAS ํ˜ธํ™˜์„ฑ ๊ณ„์ธต๊ณผ ๋ถ„๋ฆฌ ๋œ ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด API๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ช…์‹œ ์ ์œผ๋กœ ํ˜•์‹ํ™” ๋œ BLAS ์œ ์‚ฌ API
  • ์•”์‹œ ์ ์œผ๋กœ ํ˜•์‹ํ™” ๋œ ๊ฐ์ฒด ๊ธฐ๋ฐ˜ API

์ด๋Š” BLAS ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ด๋ฏธ ๋ณด์œ ํ•˜๊ณ ์žˆ๋Š” ๋ ˆ๊ฑฐ์‹œ ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ BLAS ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์นœํ™”๋ ฅ์„ ๋Š๋ผ์ง€ ๋ชปํ•  ์ˆ˜์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๊ณ ๋ฐ€๋„ ์„ ํ˜• ๋Œ€์ˆ˜ ์†”๋ฃจ์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ ์ƒ์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด BLAS ๊ตฌํ˜„๊ณผ BLAS API ์ž์ฒด์˜ ๋‹ค์–‘ํ•œ ๋‹จ์ ์— ๋Œ€ํ•œ ์ขŒ์ ˆ๊ฐ์—์„œ ํƒœ์–ด๋‚œ BLIS๋Š” 2012 ๋…„๋ถ€ํ„ฐ ์ œ ์‚ฌ๋ž‘์˜ ๋…ธ๋™์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š๊ณ  ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์•„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @tkelman. Cygwin :( :(

Linux / macOS์—์„œ BLIS์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ๋œ numpy๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝํ—˜์„ ๋“ฃ๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@fgvanzee ์ปจํ…์ŠคํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. libFLAME ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  SciPy ๋ฒค์น˜ ๋งˆํฌ ์ œํ’ˆ๊ตฐ์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@rgommers Re : libflame : ๊ด€์‹ฌ์„ ๊ฐ€์ ธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. libflame์€ ์ผ๋ถ€ TLC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BLIS๋งŒํผ ๋ชจ์–‘์ด ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์›ํ•˜๋Š”๋Œ€๋กœ ์ง€์›ํ•  ์‹œ๊ฐ„ / ์ž์›์ด ์—†์œผ๋ฉฐ ์ง€๋‚œ 6 ๋…„ ๋™์•ˆ ๊ฑฐ์˜ 100 % ๊ด€์‹ฌ์„ ๊ธฐ์šธ์—ฌ BLIS๊ฐ€ OpenBLAS์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฒฝ์Ÿ๋ ฅ์žˆ๋Š” ๋Œ€์•ˆ์ด ๋  ์ˆ˜์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ)

์–ธ์  ๊ฐ€ BLIS๊ฐ€ ์„ฑ์ˆ™ํ•˜๊ณ  ์—ฐ๊ตฌ ๋ฐฉ๋ฒ•์ด ์†Œ์ง„๋˜๋ฉด libflame / LAPACK ์ˆ˜์ค€ ๊ธฐ๋Šฅ (์˜ˆ : Cholesky, LU, QR ๋ถ„ํ•ด)์œผ๋กœ ๋‹ค์‹œ์ฃผ์˜๋ฅผ ๋Œ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์„ BLIS์— ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ์ทจํ•˜๊ฑฐ๋‚˜ ๊ถ๊ทน์ ์œผ๋กœ libflame์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ BLIS์˜ ํ•˜์œ„ ์ˆ˜์ค€ API๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ํ˜„์žฌ BLAS๋ฅผ ํ†ตํ•ด ํ”ผํ•  ์ˆ˜์—†๋Š” ์ผ๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‚ฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๋งŽ์€ ์ฃผ์ œ ์ค‘ ํ•˜๋‚˜ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์—†์ด Intel Skylake์—์„œ NumPy 1.15 ๋ฐ BLIS 0.3.2 ๋กœ์ด ๊ธฐ์‚ฌ์˜ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์‹คํ–‰

Dotted two 4096x4096 matrices in 4.29 s.
Dotted two vectors of length 524288 in 0.39 ms.
SVD of a 2048x1024 matrix in 13.60 s.
Cholesky decomposition of a 2048x2048 matrix in 2.21 s.
Eigendecomposition of a 2048x2048 matrix in 67.65 s.

์ธํ…” MKL 2018.3 :

Dotted two 4096x4096 matrices in 2.09 s.
Dotted two vectors of length 524288 in 0.23 ms.
SVD of a 2048x1024 matrix in 1.11 s.
Cholesky decomposition of a 2048x2048 matrix in 0.19 s.
Eigendecomposition of a 2048x2048 matrix in 7.83 s.

4.29 ์ดˆ์— ๋‘ ๊ฐœ์˜ 4096x4096 ํ–‰๋ ฌ์„ ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

@homocomputeris ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ „์— ๋‘ ํ–‰๋ ฌ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ๋œ "์ "๋™์‚ฌ๋ฅผ ๋“ค์–ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ํ–‰๋ ฌ ๊ณฑ์…ˆ์ธ๊ฐ€์š”?

@fgvanzee ์š”์ฆ˜ BLIS์—์„œ Windows ์ง€์› ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Windows์—์„œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„ ์ง€์›๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

@fgvanzee ๋ฐ ์˜ˆ, numpy.dot ์€ Python์—์„œ GEMM์„ ํ˜ธ์ถœํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (์ด์ƒํ•œ ์ด๋ฆ„์˜ ์ผ์ข…์ด์ง€๋งŒ ๋ฒกํ„ฐ-๋ฒกํ„ฐ, ๋ฒกํ„ฐ-ํ–‰๋ ฌ, ํ–‰๋ ฌ-ํ–‰๋ ฌ์„ ๋ชจ๋‘ ๋™์ผํ•œ API์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

@njsmith "๊ธฐ๋ณธ"Windows ์ง€์› ์ƒํƒœ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด๋Ÿฌํ•œ ์ง€์›์ด ์ด๋ฃจ์–ด ์ง€๋„๋กํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ์ „๋ฌธ์„ฑ๊ณผ ๊ด€์‹ฌ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Windows 10์ด ์ถœ์‹œ ๋œ ์ดํ›„๋กœ "Windows ์šฉ ์šฐ๋ถ„ํˆฌ"๋˜๋Š” ์ผ์ข…์˜ bash ํ˜ธํ™˜์„ฑ ํ™˜๊ฒฝ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ Windows ์ง€์›์„ ๋‹ฌ์„ฑํ•˜๊ธฐ์œ„ํ•œ ํ›จ์”ฌ ๋” ์œ ๋งํ•œ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ๊ทธ๋ฃน์˜ ์•„๋ฌด๋„ Windows์—์„œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์˜ต์…˜๋„ ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

์ข‹์•„, ์ง€๊ธˆ์€ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ ํ•˜๋‚˜ ...

@homocomputeris ๋Š” ์ด์™€ ๊ฐ™์€ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์œ„ํ•ด

@fgvanzee ๋„ค์ดํ‹ฐ๋ธŒ strided ์ง€์›์— ๋Œ€ํ•ด ๋งํ•˜๋ฉด,

@fgvanzee "bash for Windows"๋Š” ํŠนํžˆ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ VM ์ธ Windows์—์„œ Linux VM์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ค์งˆ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ข‹์€ ์†Œ์‹์€ ์ด๋ฏธ Windows ์šฉ bash๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. :-)ํ•˜์ง€๋งŒ ๋‚˜์œ ์†Œ์‹์€ ๊ธฐ๋ณธ Windows ์ง€์›์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@njsmith ๋‚ด ๊ฒฐ๊ณผ๋Š” ๊ธฐ์‚ฌ์—์„œ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
์ตœ์‹  MKL, ์˜ˆ :

Dotted two 4096x4096 matrices in 2.09 s.
Dotted two vectors of length 524288 in 0.23 ms.
SVD of a 2048x1024 matrix in 1.11 s.
Cholesky decomposition of a 2048x2048 matrix in 0.19 s.
Eigendecomposition of a 2048x2048 matrix in 7.83 s.

ํ•„์ž๋Š” CPU๊ฐ€ ์ตœ์ ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ๊ณผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด BLIS๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. MKL์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@njsmith ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ OS ์ง€์›์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ @homocomputeris ์˜ ํƒ€์ด๋ฐ์„ ์ ์ ˆํ•˜๊ฒŒ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ํ™•์ธํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ณดํญ ์ง€์›์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, ์š”์ฆ˜ ๋ณดํญ์— ์–ด๋–ค ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์˜ ์ •ํ™•ํ•œ ๋ฐฐ์ˆ˜, ์–‘์ˆ˜, ์Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ์ •๋ ฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? (๊ธฐ์–ต ํ•˜์‹œ๊ฒ ์ง€๋งŒ, numpy ๋ฐฐ์—ด์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ธก์ •๋˜๋Š” ์™„์ „ํžˆ ์ž„์˜์  ์ธ ์ŠคํŠธ๋ผ์ด๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.)

@njsmith ์ •๋ ฌ? ์•„๋‹ˆ, ๊ธ์ •์ ? ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์ œ์•ฝ์„ ํ•ด์ œํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ฒ ์ €ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์ •ํ™•ํ•œ ๋ฐฐ์ˆ˜? ๊ทธ๋ž˜, ๊ทธ๋ž˜๋„.

@devinamatthews ๋ฅผ ํ† ๋ก ์— ๊ฐ€์ ธ

@homocomputeris size ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ €์ž๊ฐ€ ์‚ฌ์šฉํ•œ ๊ฐ’ (4096)์ด 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ด๋ผ๋Š” ๊ฒƒ์ด BLIS์˜ ๊ฒฝ์šฐ ํŠนํžˆ ๋‚˜์œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ธ์ง€, ์–ด์จŒ๋“  ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠนํžˆ ํ˜„์‹ค์ ์ด์ง€ ์•Š์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  4000 (๋˜๋Š” 3000 ๋˜๋Š” 2000)์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@homocomputeris ๊ทธ๋ฆฌ๊ณ  BLIS ๊ฒฐ๊ณผ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ด๊ณ  MKL ๊ฒฐ๊ณผ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ?

FWIW, ์–ผ๋งˆ ์ „์— Windows์—์„œ BLIS๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. clang์„ ์‚ฌ์šฉํ•˜์—ฌ MSVC ํ˜ธํ™˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก mingw์˜ make๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜์žˆ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ๊ฒฐ์ฝ” ๊ทธ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์†Œ์Šค ์ฝ”๋“œ ๋‚ด์—์„œ ์ƒํ™ฉ์€ ๊ทธ๋ฆฌ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ปค๋„์— ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ Windows ์ง€์›์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์žฅ๋ฒฝ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/flame/blis/issues/220#issuecomment -397842370 ๋ฐ https://github.com/flame/blis/pull/224๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์†Œ์Šค ํŒŒ์ผ ์ž์ฒด๊ฐ€ MSVC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋งคํฌ๋กœ / ifdef๊ฐ€ ๋” ๋งŽ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์ด ์™ธ๋ถ€์ธ์œผ๋กœ์„œ์˜ ์ œ ๊ด€์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด BLIS ๋ฉ”์ดํฌ ํŒŒ์ผ์„ MSVC์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@insertinterestingnamehere Ian์„ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ MSVC๋Š” ์•„์ง C99๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์žฅ์• ๋ฌผ์ž…๋‹ˆ๋‹ค. (BLIS์—๋Š” C99๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)

๊ธ€์Ž„, ๋‚˜๋Š” BLIS๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์œ„์˜ ์˜ˆ๋ฅผ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์€ ํฌํ•จํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ๋ฌป๋Š”๋Œ€๋กœ : ์Šค๋งˆ์ผ :

  • ์ตœ์‹  BIOS ๋ฐ Spectre / Meltdown ์šฉ ํŒจ์น˜๊ฐ€ ํฌํ•จ ๋œ Intel Core i5-6260U ํ”„๋กœ์„ธ์„œ
  • Linux 4.17.3-1-ARCH
  • ๋ชจ๋“  ๊ฒƒ์ด gcc 8.1.1 20180531๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.
  • NumPy 1.15.0rc1
  • ๋‚˜๋Š” ํ–‰๋ ฌ ์ฐจ์›์— ๋Œ€ํ•œ ์†Œ์ˆ˜๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค

Intel MKL 2018.3์€ 2 ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค (์ฆ‰, ๋ฌผ๋ฆฌ์  CPU ์ฝ”์–ด).

Dotted two 3851x3851 matrices in 1.62 s.
Dotted two vectors of length 492928 in 0.18 ms.
SVD of a 1925x962 matrix in 0.54 s.
Cholesky decomposition of a 1925x1925 matrix in 0.10 s.
Eigendecomposition of a 1925x1925 matrix in 4.38 s.

BLIS 0.3.2 ์ปดํŒŒ์ผ
CFLAGS+=" -fPIC" ./configure --enable-cblas --enable-threading=openmp --enable-shared x86_64

Dotted two 3851x3851 matrices in 3.82 s.
Dotted two vectors of length 492928 in 0.39 ms.
SVD of a 1925x962 matrix in 12.82 s.
Cholesky decomposition of a 1925x1925 matrix in 2.02 s.
Eigendecomposition of a 1925x1925 matrix in 67.80 s.

๋”ฐ๋ผ์„œ BLIS๋Š” Windows ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ '์ž‘๋™ํ•˜๋ฉด ๋งŒ์ง€์ง€ ๋งˆ์‹ญ์‹œ์˜ค'๋ผ๊ณ  ์ƒ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์–ด๋„ Unix / POSIX / ์–ด๋–ค ์œ ์‚ฌ ์‹œ์Šคํ…œ์—์„œ NumPy์— ์˜ํ•ด ํ™•์‹คํžˆ ์ง€์›๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ชจ๋ฅด๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ MKL / BLIS์™€ LAPACK / libFLAME ๊ฐ„์˜ ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. ์ธํ…”์€ LAPACK, FFT ๋“ฑ๊ณผ ๊ฐ™์ด BLAS ์™ธ์— ์ตœ์ ํ™” ๋œ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

@fgvanzee ์™œ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ด BLIS์— ๋‚˜์œ๊ฐ€์š”? ๊ฐ€์žฅ ๋น ๋ฅธ FFT๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ collocations ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

numpy ๋“ฑ์˜ ๊ฒฝ์šฐ mingw / MSYS2์—์„œ ๊ฑด๋ฌผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค .--- ํ˜„์žฌ Windows์—์„œ openblas๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค (๊ทธ ์ž์ฒด๋กœ ๋Š” ์ผ์ข…์˜ ํ•ดํ‚น์ด์ง€๋งŒ). CRT ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” "์ „ํ†ต์ ์ธ"API๋กœ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜์ง€๋งŒ BLAS / LAPACK์—์„œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@fgvanzee C99์— ๋Œ€ํ•œ ์ข‹์€ ์ง€์ . WRT C99 ์ „ ์ฒ˜๋ฆฌ๊ธฐ, ๋†€๋ž๊ฒŒ๋„ MSVC 2017 ์ „ ์ฒ˜๋ฆฌ๊ธฐ์กฐ์ฐจ๋„ ๊ฑฐ๊ธฐ์—์„œ ์™„์ „ํžˆ ์žกํžˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋“ค์€ ํ˜„์žฌ ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance#note_D).

@fgvanzee @njsmith ๋‹ค์Œ์€ ์ž„์˜์˜ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ผ์ด๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

1) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ์ผ์€ ๊ฐœ์ฒด ์ธํ„ฐํŽ˜์ด์Šค์— stride_units ํ”Œ๋ž˜๊ทธ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2) ๋ชจ๋“  ๋‚ด๋ถ€๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ผ์ด๋“œ ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3) ํŒจํ‚น ํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์œ ํ˜• ์ •๋ ฌ์„ ํ™•์ธํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ํŒจํ‚น ์ปค๋„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
a) ์ผ๋ฐ˜ ํŒจํ‚น ์ปค๋„๋„ memcpy ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ„ฐ๋Ÿด ํฌ๊ธฐ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋”์ฐํ•˜๊ฒŒ ์งœ์ฆ๋‚˜ ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
4) C๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ memcpy ์‚ฌ์šฉํ•˜์—ฌ C์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฐ€์ƒ ๋งˆ์ดํฌ๋กœ ์ปค๋„๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํ–‰๋ ฌ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. alpha ๋ฐ beta ๊ฐ€ ์ž„์˜์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. x86์—์„œ๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜ (ํŠนํžˆ ARM)๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž๋™ ๋ฒกํ„ฐํ™” ํ•  ๋•Œ ์ถ”๊ฐ€ ์ •๋ ฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@homocomputeris :

  1. ๋‚˜๋Š” 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ด "์•ผ์ƒ์—์„œ"๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์šฐ๋ฆฌ ์ปดํ“จํ„ฐ ์ค‘์‹ฌ์˜ ์ธ๊ฐ„์ด 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ๋ฅผ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒค์น˜ ๋งˆํฌ์—์„œ ๊ณผ๋„ํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ• ๋ฟ์ž…๋‹ˆ๋‹ค. :)
  2. ์ด๋Ÿฌํ•œ ๋ฒค์น˜ ๋งˆํฌ ๊ฒฐ๊ณผ๋Š” ์ •๋ง ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹ค์Œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ด "์•„๋‹ˆ์˜ค"์ด๋ฉด ์ข‹๊ฒ ์ง€ ๋งŒ MKL (๋˜๋Š” BLIS)์ด ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ ์‹ค์ˆ˜๋กœ ๋‘ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  3. FFT ๊ด€๋ จ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‘ ๊ฐ€์ง€ ๊ถŒํ•œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ ํ˜ธ ์ฒ˜๋ฆฌ์—์„œ ์ผ ํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. :)
  4. BLIS๊ฐ€ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์œผ๋กœ ์ž˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ์šฐ๋ ค๋Š” ์‹ค์ œ๋กœ BLIS๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์ฐฐํ•˜๊ณ ์žˆ๋Š” ํ˜„์ƒ์€ BLIS์—์„œ ๋” ๋‘๋“œ๋Ÿฌ ์ ธ์„œ MKL๊ณผ ๊ฐ™์ด ์—„์ฒญ๋‚˜๊ฒŒ ์ตœ์ ํ™” ๋œ ์†”๋ฃจ์…˜์— ๋น„ํ•ด BLIS์— ๋Œ€ํ•œ ์ˆœ "ํŽ˜๋„ํ‹ฐ"์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ–‰๋ ฌ์ด 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ ์ธ ์ฐจ์› ์ธ ๊ฒฝ์šฐ "์„ ํ–‰ ์ฐจ์›"๋„ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. (ํ–‰๋ ฌ ์ฐจ์›์€ ํ–‰๋ ฌ์ด ์—ด์— ์ €์žฅ ๋  ๋•Œ ์—ด ๋ณดํญ์— ํ•ด๋‹นํ•˜๊ณ  ํ–‰์— ์ €์žฅ ๋  ๋•Œ ํ–‰ ๋ณดํญ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.) ๋ชจ๋ฉ˜ํŠธ ํ–‰ ์ €์žฅ์„ ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ ํ–‰ ์ฐจ์›์ด 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ ์ผ ๋•Œ ์š”์†Œ (i, j)๊ฐ€์žˆ๋Š” ์บ์‹œ ๋ผ์ธ์€ ์š”์†Œ (i + 1, j), (i + 2, j)๊ฐ€์žˆ๋Š” ์บ์‹œ ๋ผ์ธ๊ณผ ๋™์ผํ•œ ์—ฐ๊ด€์„ฑ ์„ธํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค. , (i + 3, j) ๋“ฑ์ด ๋ผ์ด๋ธŒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ›„์† ํ–‰์˜ ๋™์ผํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, gemm ์—ฐ์‚ฐ์ด C์˜ ๋ฐฐ์ • ๋ฐ€๋„ ์‹ค์ˆ˜ 6x8 ๋งˆ์ดํฌ๋กœ ํƒ€์ผ์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ํ•ด๋‹น 6 ๊ฐœ ํ–‰์€ ๋ชจ๋‘ L1 ์บ์‹œ์— ์„ค์ •๋œ ๋™์ผํ•œ ์—ฐ๊ด€์„ฑ์— ๋งคํ•‘๋˜๋ฉฐ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ผ๋ถ€๋Š” ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉ. ์ด๋Ÿฌํ•œ ์†Œ์œ„ ์ถฉ๋Œ ์‹คํŒจ๋Š” ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”„์— ๊ฐ€๋” ์„ฑ๋Šฅ์ด ๊ธ‰์ฆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ,์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ–‰๋ ฌ A์™€ B๋ฅผ ํŒจํ‚น / ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์ง€๋งŒ, ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ํžˆํŠธ๋ฅผ๋ฐ›์ง€ ์•Š๊ณ ๋Š” ํ–‰๋ ฌ C๋ฅผ ๋” ์œ ๋ฆฌํ•œ ์„ ํ–‰ ์ฐจ์›์œผ๋กœ ํŒจํ‚น ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์น˜๋ฃŒ๋ฒ•์€ ์งˆ๋ณ‘๋ณด๋‹ค ๋” ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ์ด์ œ MKL์€์ด๋ฅผ ์™„ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ถฉ๋Œ ๋ˆ„๋ฝ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ์–‘์˜ ๋งˆ์ดํฌ๋กœ ์ปค๋„๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ BLIS๊ฐ€์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์กฐ์น˜๋„ ์ทจํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  5. MKL์ด BLAS + LAPACK ๊ธฐ๋Šฅ ์ด์ƒ์ด๋ผ๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MKL์€ ์ƒ์—…์ ์œผ๋กœ ๋ณด์œ  ๋œ ๋น„๊ณต๊ฐœ ์†Œ์Šค ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋น„์ƒ์—…์  ์ธ ๋ชฉ์ ์œผ๋กœ "๋ฌด๋ฃŒ"๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ…”์ด ์•ž์œผ๋กœ ๋Œ€์ค‘์ด MKL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋‹ค์‹œ ์ถฉ์ „์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌํ˜„์„ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„์„ ์กฐ์ • ๋˜๋Š” ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ž˜ ์ดํ•ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™์ž์—๊ฒŒ๋Š” ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ•˜๋ฃจ๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ BLAS๋ฅผ ํ†ตํ•ด์ด๋ฅผ ํ‘œํ˜„ํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

@fgvanzee ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป์€ BLIS๋ฅผ ๊ตฌ์„ฑ์— ๋„ฃ์—ˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ MKL๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
SVD ๋ฐ EVD๊ฐ€ LAPACK์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

@homocomputeris ์˜ˆ, LAPACK์€ SVD ๋ฐ EVD๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  MKL์˜ ๊ตฌํ˜„์ด ๋งค์šฐ ๋น ๋ฅด๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ EVD๋Š” ์•ฝ๊ฐ„ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ํ™” ๋œ ๊ณ ์œ  ๊ฐ’ ๋ฌธ์ œ์™€ Hermitian (๋˜๋Š” ๋Œ€์นญ) EVD๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ผ๊ฐ EVD๋„ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ Hermitian EVD๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ทธ๊ฒƒ์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

NumPy๋Š” 2018 ๋…„ ๋ง์— Python 2.7 ๋ฐ 3.4 ์ง€์›์„ ์ค‘๋‹จ ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์ด๋Š” C99๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์ตœ์‹  MSVC ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต์‹ 2.7 ์ง€์›์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์ด๋™ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ตœ์‹  MSVC ์ปดํŒŒ์ผ๋Ÿฌ์˜ C99 ์ง€์›์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ http://tinyurl.com/yazmczel ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ง€์›์ด ์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ (์™„์ „ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?) ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ (Intel)๊ฐ€ ํ–ฅ์ƒ๋œ ์ˆ˜์น˜ ์ง€์›์„ ์œ„ํ•ด ์š”์ฒญ ํ–ˆ์œผ๋ฏ€๋กœ NumPy ์ž์ฒด๋ฅผ ์–ธ์  ๊ฐ€ C99๋กœ ์˜ฎ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@charris ์ด ์ •๋ณด๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, Charles. ์•„๋งˆ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค ๊ตฌํ˜„ ๋  ๊ฒƒ์ด๋‹ค ์–ด๋–ค ๊ฒฝ์šฐ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ๋•Œ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  BLIS๋Š” ๋„๋ฆฌ ์ฑ„ํƒ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด MKL์„ ์ด๊ธธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘์ ์ธ ๊ฒฝ์Ÿ์ž๋Š” OpenBLAS์ž…๋‹ˆ๋‹ค.

BLIS๋Š” ๋„๋ฆฌ ์ฑ„ํƒ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด MKL์„ ์ด๊ธธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘์ ์ธ ๊ฒฝ์Ÿ์ž๋Š” OpenBLAS์ž…๋‹ˆ๋‹ค.

๋” ์ด์ƒ ๋™์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. MKL์€ ์ž์ฒด ๋ฆฌ๊ทธ์— ์žˆ์Šต๋‹ˆ๋‹ค.

@njsmith Just curious : numpy ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ๋ฐ / ๋˜๋Š” ํ˜ผํ•ฉ ๋„๋ฉ”์ธ์—์„œ gemm ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์ƒˆ๋กœ์šด API / ๊ธฐ๋Šฅ์— ์–ผ๋งˆ๋‚˜ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, ๊ฐ ํ”ผ์—ฐ์‚ฐ์ž๋Š” A์™€ B ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋‹ค์™€ (์ž ์žฌ์ ์œผ๋กœ) ๋‹ค๋ฅธ ์ •๋ฐ€๋„๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ณ„์‚ฐ๊ณผ ํ•จ๊ป˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@fgvanzee ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์œ ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์ตœ์ ํ™” ๋œ ๋ฃจํ‹ด์„ ๊ฐ–๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ถ€์šธ์ด ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ ์ธํ•ด ๋Œ์ดํ‚ฌ ์ˆ˜์—†๋Š” ๊ณ ํ†ต์„ ๊ฒช์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ float16์ด ์žˆ์Šต๋‹ˆ๋‹ค. ML ์ง์›์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ๋” ๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @GaelVaroquaux ์ƒ๊ฐ?

@charris ์˜ˆ, ์‚ฌ๋ก€์˜ ์ˆ˜๊ฐ€ gemm ๋Œ€ํ•ด 128 ๊ฐœ์˜ ์œ ํ˜• ์กฐํ•ฉ์ด ์žˆ์œผ๋ฉฐ,์ด ์ˆซ์ž๋Š” ํ–‰๋ ฌ ์ €์žฅ ๊ฐ€๋Šฅ์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์น˜ / ํ™œ์šฉ ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ ๋ชจ๋“  ์กฐํ•ฉ ํŒฝ์ฐฝ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค (์ด ๊ฒฝ์šฐ ์ตœ๋Œ€ 55,296).

์„ฑ๋Šฅ์ด ๋‚ฎ์€ ์ฐธ์กฐ ๊ตฌํ˜„์„ ํ†ตํ•ด์„œ๋„ 128 ๊ฐœ ์ผ€์ด์Šค๋ฅผ ์™„์ „ํžˆ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ฃผ๋ชฉํ•  ๋งŒํ•˜ ๋ฉฐ, ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  BLIS์˜ ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ๊ธฐ๋ฐ˜ ๋•๋ถ„์— ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ถ”๊ฐ€ ๊ฐ์ฒด ์ฝ”๋“œ ์ธก๋ฉด์—์„œ ๋น„์šฉ์ด ๊ฑฐ์˜ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ์•ž์œผ๋กœ ๋ฉฐ์น  ๋˜๋Š” ๋ช‡ ์ฃผ ์•ˆ์— ์ €ํฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ฒญํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

BLIS ํฌํฌ๋Š” ์•ˆ์ „ํ•œ๊ฐ€์š”?

์–ด์จŒ๋“  BLIS๋Š” ๋„๋ฆฌ ์ฑ„ํƒ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด MKL์„ ์ด๊ธธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘์ ์ธ ๊ฒฝ์Ÿ์ž๋Š” OpenBLAS์ž…๋‹ˆ๋‹ค.

๊ณผ์—ฐ. ์†”์งํžˆ ๋งํ•ด์„œ NumPy + BLAS๊ฐ€ ๋‚ด ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์—ˆ์ง€๋งŒ ์ด์ „์— ์ธ์šฉ ํ•œ ๊ธฐ์‚ฌ๋ฅผ ๋ณด๋ฉด ๋งค์šฐ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ libFLAME์€ NumPy์— ์—ฐ๊ฒฐ๋˜๋ฉด LAPACK ์ž‘์—… ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AMD์˜ BLIS / libFLAME ํฌํฌ๋ฅผ ์ตœ์‹  Zen CPU์— ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€์žˆ๋Š” Intel ํ”„๋กœ์„ธ์„œ์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กœ์›Œ์ง‘๋‹ˆ๋‹ค.

Linux ๋ฐ Windows์—์„œ ํ˜„์žฌ numpy์˜ ๊ณต์‹ ํœ ์—๋Š” OpenBLAS์˜ ์‚ฌ์ „ ๋นŒ๋“œ ๋œ ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ”Œ๋žซํผ์—์„œ ์‚ฌ๋ณธ์„ ์–ป๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ pip install numpy ์ž…๋‹ˆ๋‹ค. (๋ฌผ๋ก ์ด ๋ฒ„์ „์€ ๋กœ์ปฌ์—์„œ BLIS๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋นŒ๋“œ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๊ณต์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

BLIS ํฌํฌ๋Š” ์•ˆ์ „ํ•œ๊ฐ€์š”?

@jakirkham ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด @devinamatthews์—๊ฒŒ ๋ง์”€, ๊ทธ๋Š” ๋Œ€๋‹ต์€ '์˜ˆ'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. BLIS๋Š” OpenBLAS์ฒ˜๋Ÿผ ์Šค๋ ˆ๋“œ ํ’€์„ ์œ ์ง€ํ•˜๋Š” ๋Œ€์‹  ์š”์ฒญ์‹œ (์˜ˆ : gemm ๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ) ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. numpy๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์Šค๋ ˆ๋”ฉ ๋ชจ๋ธ์„ ๊ธฐ๋Œ€ / ์„ ํ˜ธ / ์ข…์†ํ•ฉ๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค์šฐ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋”ฉ ํ’€์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? (BLIS์˜ ์ฃผ๋ฌธํ˜• ์Šค๋ ˆ๋”ฉ์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

ํŽธ์ง‘ : ๋น„์Šทํ•œ ๋งฅ๋ฝ์—์„œ pthreads๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด OpenMP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ •๋ณด์— ๋Œ€ํ•ด์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด pthreads, OpenMP๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? FWIW์—๋Š” GCC์˜ OpenMP์— ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ AFAIK๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” @ogrisel ). ํŒŒ์ด์ฌ์—์„œ multiprocessing ๋ชจ๋“ˆ์„ ํ†ตํ•ด ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ด์ฌ์—์„œ๋Š” ํฌํฌ ์•ˆ์ „ ๋ฐฉ์‹์œผ๋กœ ์Šค๋ ˆ๋“œ (์œ„์˜ ์ด์œ ๋กœ pthreads ์„ ํ˜ธ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” fork-exec๋ฅผ ์‚ฌ์šฉํ•˜๋Š” loky ์™€ ๊ฐ™์€ ์˜ต์…˜์ด ๋” ๋งŽ์ด ์žˆ์ง€๋งŒ.

๋ถ„๋ช…ํžˆ Nathaniel์€ ๋‚˜๋ณด๋‹ค ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ฒ ์ง€๋งŒ, ์ด๋ฏธ์ด ์ฃผ์„์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— IIUC NumPy๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ : BLAS)๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์Šค๋ ˆ๋”ฉ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. NumPy๋Š” GIL ์„ ์ถฉ๋ถ„ํžˆ ์ž์ฃผ ๋ฆด๋ฆฌ์Šคํ•˜๋ฏ€๋กœ Python์˜ ์Šค๋ ˆ๋”ฉ์ด ๋‹ค์†Œ ํšจ๊ณผ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Joblib, Dask ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด์ด ์ „๋žต์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ ํ’€์— ๊ด€ํ•ด์„œ๋Š” NumPy / SciPy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python์—์„œ ์ผ๋ จ์˜ BLAS ๋ฃจํ‹ด์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ML ๊ธฐ์ˆ ์„ ํ”„๋กœํŒŒ์ผ ๋งํ•˜๋Š” ์ค‘์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. OpenBLAS์™€ ์ ์ ˆํ•œ ์ˆ˜์˜ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ๋ฃจํ‹ด์€ Python์—์„œ ๋ช…์‹œ์ ์ธ ์Šค๋ ˆ๋”ฉ (NumPy ๋ฐ SciPy ํฌํ•จ)์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋ฃจํ‹ด์˜ ๊ธธ์ด์— ๋Œ€ํ•ด ์ฝ”์–ด๋ฅผ ํฌํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenBLAS๊ฐ€ ์ผ์ƒ. ์˜ˆ, ์Šค๋ ˆ๋“œ ํ’€์€ ๋ฏฟ์„ ์ˆ˜ ์—†์„๋งŒํผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ ์—์„œ BLIS๋Š” ๋™์  ์•„ํ‚คํ…์ฒ˜ ๊ฐ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ๋ฐฐํฌ ํ•  ์ˆ˜์žˆ๋Š” ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@jakirkham ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์ด์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ด€์ฐฐ ๋œ ๋น„์šฉ์€ ์ „๋‹ฌํ•˜๋Š” ํ–‰๋ ฌ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํฌ๊ธฐ์™€ ์ˆ˜ํ–‰์ค‘์ธ ์ž‘์—…์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. gemm ์ด (๊ฐ€) ๋ชฉํ‘œ๋กœํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ ์ˆ˜์ • ํ•ด์ฃผ์„ธ์š”).ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ํฌ๊ธฐ๋Š” ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? BLIS์˜ create / join ๋ชจ๋ธ์˜ ๋น„์šฉ์€ A, B, C๊ฐ€ 40x40 ์ธ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ 400x400 ์ด์ƒ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (TBH, 40x40 ๋ฌธ์ œ๋ฅผ ๋ณ‘๋ ฌํ™”ํ•จ์œผ๋กœ์จ ์‹œ์ž‘๋˜๋Š” ์†๋„ ํ–ฅ์ƒ์„ ๊ธฐ ๋Œ€ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.)

๋‹ค๋ฅธ ์ ์—์„œ BLIS๋Š” ๋™์  ์•„ํ‚คํ…์ฒ˜ ๊ฐ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ๋ฐฐํฌ ํ•  ์ˆ˜์žˆ๋Š” ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ. ์ด ๊ธฐ๋Šฅ์€ ์–ผ๋งˆ ์ „์ธ 2017 ๋…„ ํ•˜๋ฐ˜๊ธฐ์— ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BLIS๋Š” ์ด์ œ ์ผ๋ถ€ ํœด๋ฆฌ์Šคํ‹ฑ (์˜ˆ : cpuid ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์‹œ ์„ ํƒ๋˜๋Š” ํŠน์ • ํ•˜์œ„ ๊ตฌ์„ฑ์œผ๋กœ ์†Œ์œ„ "๊ตฌ์„ฑ ์ œํ’ˆ๊ตฐ"์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค intel64 , amd64 , x86_64 ์ž…๋‹ˆ๋‹ค.

@fgvanzee ์‹ค์ œ๋กœ ์ž‘์€ ํ–‰๋ ฌ์˜ ์„ฑ๋Šฅ์ด OpenBLAS์˜ ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ BLIS๊ฐ€ ๋‹ค์‹œ ๋Š๋ ค์ง€๋ฉด ์•ฝ๊ฐ„ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค ... ์‚ฌ๋žŒ๋“ค์€ ๋ถ„๋ช…ํžˆ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ƒํ™ฉ์—์„œ numpy๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ •๋ง ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์กฐ์ •์—†์ด "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘์„ฑ์ž์™€ ์ „๋ฌธ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์™€ ํ•จ๊ป˜ ์ผ์ฃผ์ผ ๋™์•ˆ ์Šˆํผ ์ปดํ“จํ„ฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์ „๋ฌธ๊ฐ€ ์ธ ๊ณ ์ „์ ์ธ ๊ณ ๋ฐ€๋„ ์„ ํ˜• ๋Œ€์ˆ˜ ์„ค์ •๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.) ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์€ ์ข…์ข… numpy๋ฅผ 3x3 ํ–‰๋ ฌ.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์ธ์‹ํ•˜๊ณ  ์Šค๋ ˆ๋”ฉ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3x3 gemm์˜ ๊ฒฝ์šฐ ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์กฐ์ • (๋˜๋Š” ์Šค๋ ˆ๋“œ ํ’€ ๋Œ€ ์Šค๋ ˆ๋“œ ํ’€ ์—†์Œ)์€ BLIS๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋ฐฐํฌ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋›ฐ์–ด ๋“ค๊ณ  ์ˆ˜ํ–‰ ํ•  ์ž‘์—… ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ €๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๋‚œ์ฃผ์— ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์Šค๋ ˆ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— gemm ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋˜ ๋ˆ„๊ตฐ๊ฐ€์™€ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํ‘œ์ค€ blas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ œ์–ด๋Š” ์ž„์˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ ์‰ฌ์šด ์ „์—ญ ์„ค์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. BLIS์˜ ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ธ์ถœ ๋‹จ์œ„๋กœ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? IIRC๋Š” BLAS ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด ์™ธ๋ถ€์— ์ „์—ญ ๊ตฌ์„ฑ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์‹ค์ œ๋กœ ์ž‘์€ ํ–‰๋ ฌ์˜ ์„ฑ๋Šฅ์ด OpenBLAS์˜ ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ BLIS๊ฐ€ ๋‹ค์‹œ ๋Š๋ ค์ง„๋‹ค๋ฉด ์•ฝ๊ฐ„ ๊ฑฑ์ •์ด๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ numpy๋ฅผ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ "๊ทธ๋ƒฅ ํŠน์ • ๊ฒฝ์šฐ์— ๋งž๊ฒŒ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "๊ทธ๋ƒฅ ์ž‘๋™ํ•˜๊ธฐ"๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ํ˜„์‹ค์ ์ด๊ณ  ์ •์งํ•˜๊ฒŒํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ ์žˆ๋‹ค. 3x3 ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์„ฑ๋Šฅ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋ฉด BLIS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. BLIS๊ฐ€ 3x3์˜ ์ˆœ์ง„ํ•œ ํŠธ๋ฆฌํ”Œ ๋ฃจํ”„๋ณด๋‹ค 10 ๋ฐฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ง์ด ์•„๋‹™๋‹ˆ๋‹ค. BLIS์˜ ๊ตฌํ˜„์ด ๋›ฐ์–ด๋‚œ ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž‘์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด OpenBLAS์— ๋‹ค์†Œ ๋ถˆ๋งŒ์กฑ ํ•˜์‹ ๋‹ค๋Š” ๋ง์„ ๋“ฃ๊ณ  ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๊ธฐ์ค€์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํฐ ๋ฌธ์ œ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋‚ฎ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๊นŒ? ์ž‘์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ํฐ ๋ฌธ์ œ์™€๋Š” ๋‹ค๋ฅธ ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๋‹ค์Œ ๋Œ€์ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋ฅผ ์ฐจ์„ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์ธ์‹ํ•˜๊ณ  ์Šค๋ ˆ๋”ฉ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3x3 gemm์˜ ๊ฒฝ์šฐ ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ปท์˜คํ”„๊ฐ€ ์ด์ƒ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ปท์˜คํ”„๊ฐ€ ์–ด๋””์— ์žˆ์–ด์•ผํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ด ์•„๋‹ˆ๋ฉฐ ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ฒŒ ์•„ํ‚คํ…์ฒ˜ (๋ฐ ๋ ˆ๋ฒจ 3 ์šด์˜ ์ „๋ฐ˜)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ž˜ ๊ณ ๋ ค๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์กฐ์ • (๋˜๋Š” ์Šค๋ ˆ๋“œ ํ’€ ๋Œ€ ์Šค๋ ˆ๋“œ ํ’€ ์—†์Œ)์€ BLIS๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋ฐฐํฌ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋›ฐ์–ด ๋“ค๊ณ  ์ˆ˜ํ–‰ ํ•  ์ž‘์—… ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ.

์‚ฌ์‹ค ์ €๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๋‚œ์ฃผ์— ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์Šค๋ ˆ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— gemm ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋˜ ๋ˆ„๊ตฐ๊ฐ€์™€ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํ‘œ์ค€ blas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ œ์–ด๋Š” ์ž„์˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ ์‰ฌ์šด ์ „์—ญ ์„ค์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ˆœ์ฐจ gemm ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. (์•Œ๋ฆผ : ์ˆœ์ฐจ gemm ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ๋น„ํ™œ์„ฑํ™” ํ•œ ์ƒํƒœ๋กœ BLIS๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ณ  ๋‚˜์ค‘์— ์Šค๋ ˆ๋”ฉ์„ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.)

BLIS์˜ ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ธ์ถœ ๋‹จ์œ„๋กœ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? IIRC๋Š” BLAS ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด ์™ธ๋ถ€์— ์ „์—ญ ๊ตฌ์„ฑ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์ด ํ™œ์„ฑํ™” ๋œ ์ƒํƒœ์—์„œ BLIS๋ฅผ ๊ตฌ์„ฑํ•˜๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค (ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ). ์ด๊ฒƒ์ด ๊ทธ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ •๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. BLIS์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ BLIS ๋‚ด๋ถ€์ ์œผ๋กœ setenv() ๋ฐ getenv() ๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ฝ๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ์œ„ํ‚ค ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.) ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์นœ๊ตฌ์—๊ฒŒ ๊ฑฐ๋ž˜๋ฅผ ๋ฐฉํ•ดํ•˜๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋”ฉ์„๋ณด๋‹ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ (ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ)์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜์žˆ๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์•„์ง ๊ทธ ์ •๋„๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ”„๋ผ๊ฐ€ ๋ชจ๋‘ ์ œ์ž๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ณ‘๋ ฌํ™” ํ•  ๋•Œ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•˜๋„๋ก ์ˆ˜๋…„์— ๊ฑธ์ณ (์˜ˆ : OMP_NUM_THREADS ๋“ฑ) ๊ต์œก์„ ๋ฐ›์•˜์œผ๋ฉฐ, ์ด๋Š” BLIS๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ •๋ณด๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ™” ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. gemm ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” 5 ๊ฐœ์˜ ๋ฃจํ”„๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ทธ์ค‘ 4 ๊ฐœ๋Š” ๋ณ‘๋ ฌํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ–ฅํ›„ 5 ๊ฐœ). ํ•˜๋‚˜์˜ ์ˆซ์ž๋กœ ์ถ”์ธก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋“œ์›จ์–ด ํ† ํด๋กœ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด์ด ์ „์„ ์—์„œ ์ง„ํ–‰์„ ๋ฐฉํ•ดํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

@devinamatthews ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ TBLIS๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

3x3 ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์„ฑ๋Šฅ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋ฉด BLIS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. BLIS๊ฐ€ 3x3์˜ ์ˆœ์ง„ํ•œ ํŠธ๋ฆฌํ”Œ ๋ฃจํ”„๋ณด๋‹ค 10 ๋ฐฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ง์ด ์•„๋‹™๋‹ˆ๋‹ค. BLIS์˜ ๊ตฌํ˜„์ด ๋›ฐ์–ด๋‚œ ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3x3 ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์–ป๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์ง€ ๋งŒ!). ๊ทธ๋Ÿฌ๋‚˜ ๊ทน๋‹จ์  ์ธ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด : numpy๊ฐ€ ๊ธฐ๋ณธ ์„ ํ˜• ๋Œ€์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ BLIS๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ์ผ๋ถ€ ์‚ฌ์šฉ์ž๊ฐ€ numpy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์— a @ b ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด 10 ๋ฐฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ˆœ์ง„ํ•œ ๊ตฌํ˜„๋ณด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ 3x3 ํ–‰๋ ฌ์„ ๋‹ค์ค‘ํ™”ํ•˜๊ธฐ ์ „์— numpy๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. :-). ํŠนํžˆ ํ•œ ๊ณณ์—์„œ 3x3 ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ 1000x1000 ํ–‰๋ ฌ์„ ๊ณฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•Œ๋ฆผ : ์ˆœ์ฐจ gemm์ด ์œ ์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ธ ๊ฒฝ์šฐ, ๊ทธ๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ๋น„ํ™œ์„ฑํ™” ํ•œ ์ƒํƒœ์—์„œ BLIS๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ณ  ๋‚˜์ค‘์— ์Šค๋ ˆ๋”ฉ์„ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์†กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ž์ฒด ์ฝ”๋“œ์™€ ๊ฒฐํ•ฉ ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” GEMM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ๊ฐ€ ์ œ์–ดํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์•Œ๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋„ GEMM์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” GEMM์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ด€๋ จ์—†๋Š” ํ˜ธ์ถœ์— ์šฐ์—ฐํžˆ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š๊ณ  GEMM์— ๋Œ€ํ•œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋”ฉ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” GEMM ์‚ฌ๋ณธ์„ ์ง์ ‘ ๋ฐฐ์†กํ•˜์ง€ ์•Š๊ณ ๋„์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์„ฑ ๊ฐ€์‹œ๊ณ , ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ๋ณธ ๋‘ ๊ฐœ๋ฅผ ํฌํ•จํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐœ๋…์ ์œผ๋กœ ๋ชจ์š•์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์ •์ˆ˜ ๋ณ€์ˆ˜ number_of_threads ๋‘ ๋ณต์‚ฌ๋ณธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋” ๋ง์ด ๋˜๋‚˜์š”?

์ˆœ์ง„ํ•œ ๊ตฌํ˜„๋ณด๋‹ค 10 ๋ฐฐ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด์ œ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋งค์šฐ ์ž‘์€ (3x3) ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ˆœ์ง„ํ•œ ๊ฒƒ๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋Š๋ฆฌ๋‹ค๊ณ ํ•ด๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํฌ๋กœ์Šค ์˜ค๋ฒ„ ํฌ์ธํŠธ๋Š” 16x16๋งŒํผ ์ž‘์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ฐ˜์ฐฝ๊ณ ๋ฅผ ๋ถ™์ด๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. (๋ชจ๋“  ๋ ˆ๋ฒจ 3 ์ž‘์—…์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์†กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ž์ฒด ์ฝ”๋“œ์™€ ๊ฒฐํ•ฉ ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” GEMM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ๊ฐ€ ์ œ์–ดํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์•Œ๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋„ GEMM์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” GEMM์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ด€๋ จ์—†๋Š” ํ˜ธ์ถœ์— ์šฐ์—ฐํžˆ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š๊ณ  GEMM์— ๋Œ€ํ•œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋”ฉ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” GEMM ์‚ฌ๋ณธ์„ ์ง์ ‘ ๋ฐฐ์†กํ•˜์ง€ ์•Š๊ณ ๋„์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์„ฑ ๊ฐ€์‹œ๊ณ , ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ๋ณธ ๋‘ ๊ฐœ๋ฅผ ํฌํ•จํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐœ๋…์ ์œผ๋กœ ๋ชจ์š•์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์ •์ˆ˜ ๋ณ€์ˆ˜ number_of_threads์˜ ๋‘ ๋ณต์‚ฌ๋ณธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋” ๋ง์ด ๋˜๋‚˜์š”?

๋„ค, ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์Šค๋ ˆ๋”ฉ API์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ํ›„๋ณด๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ทœ์น™์€ ๊ฒฝ๊ณ„์„ ์˜ ๋ฏธ์นœ ์ง“ ํ•˜๋‚˜ ๊ฐœ ์ด์ƒ์˜ ๊ฒฝ์šฐ์— ๋‚ด ํ˜‘๋ ฅ์ž์— ๋‚ด ๊ฐ์ •์„ ํ‘œํ˜„ํ–ˆ๋‹ค ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ง์€ HPC ์‚ฌ์šฉ์ž / benchmarkers์˜ ๋„“์€ ํ•œ๋ฒˆ ๋ฒค ๋ฉด์ ์— ์˜คํžˆ๋ ค ํŽธ๋ฆฌํ•˜๋‹ค, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๋‹คํ•ด์•ผํ•˜๋ฏ€๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š๋Š” ์ ์ ˆํ•œ ๋Ÿฐํƒ€์ž„ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘๊ฐ€ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.)

์ด๊ฒƒ์ด ํ™•์‹คํžˆ ์šฐ๋ฆฌ์˜ ๋ ˆ์ด๋”์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ทธ์—๊ฒŒ ์ „๋‹ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋กœ๋ฒ„ํŠธ์™€ ํ•จ๊ป˜ ๋ชจ์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋‚ด๊ฐ€์ด ์ผ์— ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์กฐ๋งŒ๊ฐ„ ์Šน์ธ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ด€์‹ฌ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์Šค๋ ˆ๋”ฉ API๋Š” ํ•œ๋™์•ˆ ๊ทธ์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.)

MSVC ABI๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” clang.exe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Windows์— BLIS๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ์—ฌ๊ธฐ ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๋Š” OpenBLAS์— ๋น„ํ•ด ๋†€๋ž๋„๋ก ์ ์—ˆ์Šต๋‹ˆ๋‹ค.
๋กœ๊ทธ๋Š” ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค . ๋ชจ๋“  BLIS ๋ฐ BLAS ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

@isuruf ์‹œ๊ฐ„์„๋‚ด์–ด

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์— ๊ด€ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋ฉ˜ํŠธ / ์š”์ฒญ (๋ชจ๋‘ ์•„์ฃผ ์‚ฌ์†Œํ•œ)์ด ์žˆ์ง€๋งŒ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ž์ฒด์— ๋Œ€ํ•œ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถ”์‹  : f2c ์˜ค๋ฅ˜๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜์žˆ์–ด์„œ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค. libf2c์˜ ์ถฉ๋ถ„ํ•œ ๋ถ€๋ถ„์„ BLAS ํ…Œ์ŠคํŠธ ๋“œ๋ผ์ด๋ฒ„ ์†Œ์Šค ( libf2c.a ๋กœ ์ปดํŒŒ์ผ ๋จ)๋กœ ๊ฐ€์ ธ ์™€์„œ ๋งํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ํ—ค๋” ํŒŒ์ผ์— ์•ฝ๊ฐ„์˜ ํ•ด์ปค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. (์ €๋Š” Fortran ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Fortran๋ณด๋‹ค f2c'ed C๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.

์ธํ…” MKL 2018.3 :

Dotted two 4096x4096 matrices in 2.09 s.
Dotted two vectors of length 524288 in 0.23 ms.
SVD of a 2048x1024 matrix in 1.11 s.
Cholesky decomposition of a 2048x2048 matrix in 0.19 s.
Eigendecomposition of a 2048x2048 matrix in 7.83 s.

์œ„์—์„œ ์‚ฌ์šฉ ๋œ ๋ฒค์น˜ ๋งˆํฌ์— ๋Œ€ํ•œ ๋‹จ์–ด. Robert๋Š”์ด ๋ฒค์น˜ ๋งˆํฌ (๋˜๋Š” numpy?)๊ฐ€ Cholesky, EVD ๋ฐ SVD๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†์„ ๊ฒƒ์ž„์„ ์ƒ๊ธฐ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ ˆ ์Šคํ‚ค ๋ถ„ํ•ด์— netlib LAPACK ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ ์ž˜๋ชป๋ฉ๋‹ˆ๋‹ค (์ด์ƒ์ ์ธ ๊ฒƒ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์ง). ๋˜ํ•œ MKL์— ๋Œ€ํ•œ numpy ๋งํฌ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ MKL์—๋Š” ๋น ๋ฅธ gemm ์™ธ์—๋„ ์ž์ฒด Cholesky ์ธ์ˆ˜ ๋ถ„ํ•ด ๊ตฌํ˜„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ๋” ์™œ๊ณก ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„๊ตํ•  ๋•Œ ์‚ฌ๊ณผ ๋Œ€ ์‚ฌ๊ณผ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. MKL.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹จ์ˆœํžˆ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ๊ทผ์‚ฌํ•œ ๋น„๊ต๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์•…๋งˆ๊ฐ€ ์ˆจ์–ด์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•˜์‹ญ์‹œ์˜ค.

์ผ๋ฐ˜์ ์œผ๋กœ numpy๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ LAPACK ๋˜๋Š” LAPACK ์œ ์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค. MKL ๋นŒ๋“œ๋Š” ์ธํ…”์ด MKL ๋‚ด๋ถ€์— ์ œ๊ณตํ•˜๋Š” LAPACK์˜ ํŠœ๋‹ ๋œ ํฌํฌ๋ฅผ ๊ฑฐ์˜ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. BLIS ๋นŒ๋“œ๋Š” ์•„๋งˆ๋„ ์ฐธ์กฐ LAPACK ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์˜๋ฏธ์—์„œ ์ด๊ฒƒ์€ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ SVD๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด numpy ๊ตฌ์„ฑ์„ ์„ ํƒํ•˜๋ ค๋Š” ๊ฒฝ์šฐ MKL์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์กฐ์ • ๋œ ๋ฒ„์ „์ด ์žˆ๊ณ  BLIS์—๋Š”์—†๋Š” ๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (์ €๋Š” OpenBLAS๊ฐ€ ๊ทธ ์‚ฌ์ด์— ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ LAPACK์˜ ์ˆ˜์ • ๋œ ๋ฒ„์ „์„ ์ œ๊ณตํ•˜์ง€๋งŒ MKL ๋ฒ„์ „๋ณด๋‹ค ์ฐธ์กฐ ๊ตฌํ˜„์— ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.)ํ•˜์ง€๋งŒ BLIS๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ๊ทธ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ ํ•œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” ์ด์™€ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ GEMM ํšจ์œจ์„ฑ๋ณด๋‹ค SVD / ๋“ฑ์— ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์˜๋ฏธ์—์„œ ์ด๊ฒƒ์€ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ดํ•ดํ•˜๊ณ  ๋™์˜ํ•œ๋‹ค. ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์ด์ „์— ์ œ์•ˆ ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ํ•˜๋“œ์›จ์–ด์—์„œ ์ ˆ๋Œ€ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  (์ฆ‰, ๊ตฌํ˜„์ด ์ตœ๊ณ  ์„ฑ๋Šฅ์— ๋น„ํ•ด ์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด),์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„์„ ๋น„๊ตํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ธํ•ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋กœ๋ฒ„ํŠธ์˜ Cholesky et al. ํ›„์ž๋ณด๋‹ค ์ „์ž๋ฅผ ๋” ๋งŽ์ด ๊ฒจ๋ƒฅํ•ฉ๋‹ˆ๋‹ค.

@njsmith @insertinterestingnamehere @rgommers @charris Isuru ์˜ ๋น ๋ฅธ ์ž‘์—… ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” ๊ทธ์˜ Appveyor ๊ธฐ๋ฐ˜ Windows ์ง€์›์„ BLIS์˜ master ๋ธŒ๋žœ์น˜๋กœ ๊ตฌ์ฒดํ™”ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ numpy์— ๋Œ€ํ•œ Windows ์ง€์› ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ •๋„๋ฅผ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@fgvanzee PR์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

PR์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋นŒ๋“œ ์„ค์ •์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! ์ ์–ด๋„ ์ด๋ก  ์ƒ์œผ๋กœ๋Š” Windows์—์„œ BLIS๋กœ numpy๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. dll ๋นŒ๋“œ ๋˜๋Š” MinGW ์ง€์›๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ์ข…์†์„ฑ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ : pthreads-win32๋Š” LGPL์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€ IDK.

๋ผ์ด์„ ์Šค๋Š” ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฒ•์  ์ •์ฑ…์œผ๋กœ ์ธํ•ด LGPL๊ณผ ๊ฐ™์€ "์นดํ”ผ ๋ ˆํ”„ํŠธ"๋ผ์ด์„ผ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ "ํ—ˆ์šฉ"๋ผ์ด์„ผ์Šค๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š” ๋ช‡๋ช‡ ๋Œ€๊ธฐ์—…์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. NumPy / SciPy ์ฝ”๋“œ๋ฒ ์ด์Šค ๋˜๋Š” ํœ ์— LGPL ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ •๋‹นํ•˜๊ฑด ์•„๋‹ˆ๊ฑด ํ™•์‹คํžˆ ์šฐ๋ ค์˜ ์›์ธ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LGPL ๋ถ€ํ’ˆ์„ ๋ฐ”ํ€ด๋กœ ์šด์†กํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€์žˆ๋Š” GPL ์ธ gfortran dll์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. gh-8689 ์ฐธ์กฐ

๊ณผ์—ฐ. ๋˜ํ•œ ๊ทธ๋Ÿฌํ•œ ํšŒ์‚ฌ๊ฐ€ MKL์„ ์„ ํ˜ธํ•˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

LGPL ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ •์ ์œผ๋กœ ๋งํฌ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

@jakirkham ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์ด์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ด€์ฐฐ ๋œ ๋น„์šฉ์€ ์ „๋‹ฌํ•˜๋Š” ํ–‰๋ ฌ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํฌ๊ธฐ์™€ ์ˆ˜ํ–‰์ค‘์ธ ์ž‘์—…์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. gemm์ด ๋‹น์‹ ์ด ๋ชฉํ‘œ๋กœ ์‚ผ๋Š” ์ „ํ˜•์ ์ธ ์ž‘์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ (๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค), ์–ด๋–ค ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ์ „ํ˜•์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๊นŒ? BLIS์˜ create / join ๋ชจ๋ธ์˜ ๋น„์šฉ์€ A, B, C๊ฐ€ 40x40 ์ธ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ 400x400 ์ด์ƒ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (TBH, 40x40 ๋ฌธ์ œ๋ฅผ ๋ณ‘๋ ฌํ™”ํ•จ์œผ๋กœ์จ ์‹œ์ž‘๋˜๋Š” ์†๋„ ํ–ฅ์ƒ์„ ๊ธฐ ๋Œ€ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.)

์ฃผ๋กœ GEMM๊ณผ SYRK๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. GEMV๊ฐ€ ๊ฐ€๋” ๋‚˜์˜ค์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด ํฐ GEMM ์ž‘์—…์œผ๋กœ ํ†ตํ•ฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ 10 ^ 6 ์š”์†Œ์˜ ์ฐจ์› ์ธ 1 ์ฐจ์›์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋น„์ •ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” 10 ^ 3์—์„œ 10 ^ 6๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ดํ•ด์•ผ โ€‹โ€‹ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ„๊ธฐ๋˜๋ฉด ์Šค๋ ˆ๋“œ ํ’€์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์ ์—์„œ BLIS๋Š” ๋™์  ์•„ํ‚คํ…์ฒ˜ ๊ฐ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ๋ฐฐํฌ ํ•  ์ˆ˜์žˆ๋Š” ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ. ์ด ๊ธฐ๋Šฅ์€ ์–ผ๋งˆ ์ „์ธ 2017 ๋…„ ํ•˜๋ฐ˜๊ธฐ์— ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BLIS๋Š” ์ด์ œ ์ผ๋ถ€ ํœด๋ฆฌ์Šคํ‹ฑ (์˜ˆ : cpuid ๋ช…๋ น)์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์‹œ ์„ ํƒ๋˜๋Š” ํŠน์ • ํ•˜์œ„ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์œ„ "๊ตฌ์„ฑ ์ œํ’ˆ๊ตฐ"์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ์ œํ’ˆ๊ตฐ์˜ ์˜ˆ๋Š” intel64, amd64, x86_64์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๋จธ๋ฆฌ๋ง์„ ๋ถ™์ด๊ธฐ ์œ„ํ•ด Broadwell์„ ํ†ตํ•ด Nehalem์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ž˜๋œ ์ปดํ“จํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐœ์ธ์šฉ ์ปดํ“จํ„ฐ์—๋Š” Kaby Lake๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋Œ€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ๋™์‹œ์— ์ œ๊ณต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Flame์˜ ํ•˜์œ„ ๊ตฌ์„ฑ์ด์ด ๋ฒ”์œ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ ์ ˆํ•œ ์ปค๋„์„ ๋””์ŠคํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ ๋œ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ์„ธ๋ถ„ํ™”๋ฉ๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ปค๋„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์ค‘์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

x86_64 ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ @jakirkham์„ ๊ตฌ์ถ•ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€

  • Penryn (Nehalem ๋ฐ ๊ธฐํƒ€ 64 ๋น„ํŠธ SSSE3 Intel ์นฉ ํฌํ•จ)
  • ์ƒŒ๋”” ๋ธŒ๋ฆฌ์ง€ (์•„์ด๋น„ ๋ธŒ๋ฆฌ์ง€ ํฌํ•จ)
  • Haswell (+ Broadwell, Skylake, Kaby Lake ๋ฐ Coffee Lake, ๋งˆ์ง€๋ง‰ 3 ๊ฐœ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ตœ์  ์€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ)
  • Xeon Phi (1 ์„ธ๋Œ€ ๋ฐ 2 ์„ธ๋Œ€, ํ•„์š”ํ•œ ๊ฒฝ์šฐ 3 ์„ธ๋Œ€๋„ ๊ฐ€๋Šฅ)
  • Skylake SP / X / W (์•„๋งˆ๋„ Cannon Lake์—์„œ๋„ ์ตœ์ ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค)
  • ๋ถˆ๋„์ € / ํŒŒ์ผ ๋“œ๋ผ์ด๋ฒ„ / ์ŠคํŒ€ ๋กค๋Ÿฌ / ๊ตด์ฐฉ๊ธฐ
  • ๋ผ์ด์   / EPYC

์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ / ๋˜๋Š” binutils ๋ฒ„์ „์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋นŒ๋“œ ๋จธ์‹ ์—์„œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

AFAIK libflame์—๋Š” ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์ปค๋„์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋‘ BLIS์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@jakirkham ์šฐ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ ํ’€ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํฌํฌ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ด์•ผํ•˜๋Š” ๊ธฐ๋ณธ fork-join ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

AFAIK libflame์—๋Š” ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์ปค๋„์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋‘ BLIS์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. libflame์—๋Š” Givens ํšŒ์ „์„ ์ ์šฉํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅ (ํ˜„์žฌ SSE ๋งŒ) ์ปค๋„์ด ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ปค๋„์€ libflame์— ์†ํ•˜์ง€ ์•Š์œผ๋ฉฐ BLIS๊ฐ€ ์ž‘์„ฑ ๋  ๋‹น์‹œ ์กด์žฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ์ˆ˜์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ์ปค๋„์€ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋˜๋ฉฐ BLIS๋กœ ์žฌ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

Flame์˜ ํ•˜์œ„ ๊ตฌ์„ฑ์ด์ด ๋ฒ”์œ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ ์ ˆํ•œ ์ปค๋„์„ ๋””์ŠคํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ ๋œ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ์„ธ๋ถ„ํ™”๋ฉ๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ปค๋„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์ค‘์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@jakirkham ์ด ๊ฒฝ์šฐ "๋ถˆ๊ฝƒ"์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. libflame๊ณผ BLIS์˜ ๋‘ ๊ฐ€์ง€ ์ œํ’ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. libflame์€์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์žฌ ์ž‘์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ๊ฑฐ์˜ ๋ชจ๋“ ์ฃผ์˜๊ฐ€ BLIS์—์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ๋กœ "Flame"์„ "BLIS"๋กœ ๋ฐ”๊พธ๋ฉด ๋Œ€๋‹ต์€ "์˜ˆ, ๋Œ€๋ถ€๋ถ„"์ž…๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ์„ธ๋ถ„ํ™”๋ฉ๋‹ˆ๊นŒ?

๋ฌด์Šจ ๋œป์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ BLIS์˜ ์ปค๋„ ์ง€์›์€ OpenBLAS๋งŒํผ ๊ด‘๋ฒ”์œ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ์ข…์ข… ๋ณต์žกํ•œ ๋„๋ฉ”์ธ trsm ์ตœ์ ํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปค๋„์€ ์ผ๋ถ€ ์กฐํ•ฉ์—์„œ ํ•˜์œ„ ๊ตฌ์„ฑ์— ์˜ํ•ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ๊ตฌ์„ฑ์€ cpuid ๋ฅผ ํ†ตํ•ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ๊ตฌ์„ฑ์— ์˜ํ•ด "๋“ฑ๋ก"๋œ ์ปค๋„์„ ์ •ํ™•ํ•˜๊ฒŒ ์–ป์Šต๋‹ˆ๋‹ค. ๋„ˆํŠธ์™€ ๋ณผํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์œ„ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๋Ÿฌํ•œ ์ปค๋„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์ค‘์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์ด ํ•˜๋“œ์›จ์–ด ๊ฒ€์ƒ‰์„ ๋Ÿฐํƒ€์ž„ ํ•„์š”ํ•˜๋ฉด ๊ตฌ์„ฑ ์ œํ’ˆ๊ตฐ (์˜ˆ : ๋Œ€์ƒ intel64 , x86_64 ๋Œ€์‹  ํŠน์ • ํ•˜์œ„ ๊ตฌ์„ฑ์˜ ๊ตฌ์„ฑ ํƒ€์ž„์— () ๋˜๋Š” auto , ์„ ํƒ์„ ํŠน์ • ํ•˜์œ„ ๊ตฌ์„ฑ). ๊ทธ๊ฒŒ ๋‹ค์•ผ.

์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ดํ•ด์•ผ โ€‹โ€‹ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ„๊ธฐ๋˜๋ฉด ์Šค๋ ˆ๋“œ ํ’€์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์ด์ „์—์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งํ–ˆ๋“ฏ์ด BLIS๋Š” ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ํฌํฌ ์•ˆ์ „์— ๋Œ€ํ•ด Devin์—๊ฒŒ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ํฌํฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

์ฐธ๊ณ ๋กœ BLIS conda ํŒจํ‚ค์ง€๋Š” conda-forge์˜ Linux, osx, Windows์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ˜„์žฌ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ์ถ• ์ค‘์ด๋ฉฐ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ํŒจํ‚ค์ง€๋Š” pthread๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  x86_64 ๊ตฌ์„ฑ์œผ๋กœ ๋นŒ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์†กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ž์ฒด ์ฝ”๋“œ์™€ ๊ฒฐํ•ฉ ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” GEMM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ๊ฐ€ ์ œ์–ดํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์•Œ๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋„ GEMM์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” GEMM์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ด€๋ จ์—†๋Š” ํ˜ธ์ถœ์— ์šฐ์—ฐํžˆ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š๊ณ  GEMM์— ๋Œ€ํ•œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋”ฉ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@njsmith ๋กœ๋ฒ„ํŠธ์™€ ์ด์•ผ๊ธฐ๋ฅผ

@jakirkham ์ธํ…” ๋‹ด๋‹น์ž ์ค‘ ํ•œ ๋ช…์ธ @jeffhammond ๋Š” OpenMP ๊ตฌํ˜„์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ํ’€ ๋ชจ๋ธ์„ ์ผ์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Š” BLIS ๋‚ด์—์„œ ์Šค๋ ˆ๋“œ ํ’€์„ ์ค‘๋ณต์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ œ์•ˆํ•œ๋Œ€๋กœ numpy๊ฐ€ pthread๋ฅผ ํ•„์š”๋กœํ•˜๊ฑฐ๋‚˜ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ fork / join-style pthreads API ์•„๋ž˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ œ fork / join์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด pthreads, OpenMP๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ์ด ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. BLIS์˜ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. pthreads ๋˜๋Š” OpenMP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ดˆ๊ธฐํ™”์— ์‚ฌ์šฉ๋˜๋Š” pthread_once() ์— ๋Œ€ํ•œ ์˜์กด์œผ๋กœ ์ธํ•ด pthread์— ๋Œ€ํ•œ BLIS์˜ ๋ฌด์กฐ๊ฑด ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๊ณผ ํ˜ผ๋™ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.)

๋ถˆํ–‰ํžˆ๋„ OpenMP ๊ตฌํ˜„ (์˜ˆ : GOMP)์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํฌ์— ๋Œ€ํ•ด ๋” ๊ฐ•๋ ฅ ํ•ด์ง€์ง€ ์•Š๋Š” ํ•œ, Python์—์„œ๋Š” ์‹ค์ œ๋กœ ์•ˆ์ „ํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ ์Šคํƒ์—์„œ NumPy๋งŒํผ ๋‚ฎ์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ OpenMP ๊ตฌํ˜„ (์˜ˆ : GOMP)์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํฌ์— ๋Œ€ํ•ด ๋” ๊ฐ•๋ ฅ ํ•ด์ง€์ง€ ์•Š๋Š” ํ•œ, Python์—์„œ๋Š” ์‹ค์ œ๋กœ ์•ˆ์ „ํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ ์Šคํƒ์—์„œ NumPy๋งŒํผ ๋‚ฎ์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๋”ฐ๋ผ์„œ numpy๋Š” BLIS๋ฅผ ํ†ตํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ์œ„ํ•ด --enable-threading=pthreads ๊ตฌ์„ฑ ์˜ต์…˜์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

pthread๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ numpy๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Python ํ”„๋กœ์„ธ์Šค / ์Šค๋ ˆ๋“œ ํ’€๊ณผ ์ค‘์ฒฉ ๋œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ๋•Œ ์ดˆ๊ณผ ๊ตฌ๋… ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ถ€ ๊ณต์šฉ API๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ณต์šฉ ๊ธฐํ˜ธ์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/tomMoral/loky/pull/135/files#diff -e49a2eb30dd7db1ee9023b8f7306b9deR111

MKL ๋ฐ OpenMP ์šฉ https://github.com/IntelPython/smp ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

pthread๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ numpy๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Python ํ”„๋กœ์„ธ์Šค / ์Šค๋ ˆ๋“œ ํ’€๊ณผ ์ค‘์ฒฉ ๋œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ๋•Œ ์ดˆ๊ณผ ๊ตฌ๋… ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ถ€ ๊ณต์šฉ API๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ogrisel ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค, Olivier. ๋Ÿฐํƒ€์ž„์— ์Šค๋ ˆ๋”ฉ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ „์—ญ ์˜๋ฏธ๋ก ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ( gemm ๋˜๋Š” ๊ทธ ์–ด๋–ค ๊ฒƒ์ด ๋“  ํ˜ธ์ถœ ๋‹น ๊ธฐ์ค€์ด ์•„๋‹ˆ๋ผ ์ „์—ญ์ด ์•„๋‹Œ) ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณต๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ BLIS์˜ ์†Œ์œ„ "์ „๋ฌธ๊ฐ€"ํ•˜์œ„ API ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ gemm ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ์žฌ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ํ˜ธ์ถœ๋ณ„๋กœ ๋ณ‘๋ ฌํ™” ์ „๋žต์„ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ BLIS๊ฐ€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์–ป์„ ์œ„์น˜ ๋˜๋Š” ํ–‰๋ ฌ ๊ณฑ์…ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (BLIS๊ฐ€ ์„ ํ˜ธํ•˜๋Š”๋Œ€๋กœ)์˜ ๊ฐ ๋ฃจํ”„์— ๋Œ€ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ตœ์„ ์„ ๋‹คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ ์ด ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์ฏค ์™„๋ฃŒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ github์— ํ‘ธ์‹œํ•œ์ง€ 1 ์ฃผ์ผ ์ •๋„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„ํš์ด ๊ท€ํ•˜์—๊ฒŒ ํšจ๊ณผ๊ฐ€์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ฑฐ๋‚˜์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์šฐ๋ ค ์‚ฌํ•ญ์ด๋‚˜ ์š”์ฒญ์ด์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ถ”์‹  : ๋‹น์‹ ์ด ์ œ๊ณต ํ•œ ๋กœํ‚ค ๋งํฌ๋ฅผ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐํ˜ธ๋Š” ๋ชจ๋‘ ์Šค๋ ˆ๋“œ์˜ ์ „์—ญ ์„ค์ •์„ ์œ„ํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์ œํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ 8 ๊ฐœ์˜ ์ฝ”์–ด / ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ 2 ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ์Šค๋ ˆ๋“œ๋Š” 4 ๋ฐฉํ–ฅ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” gemm ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” 3 ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์—์„œ 2 ๊ฐœ๋Š” ์–‘๋ฐฉํ–ฅ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ gemm ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์„ธ ๋ฒˆ์งธ๋Š” 4 ๋ฐฉํ–ฅ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋‹น์‹ ์€ ์•„์ด๋””์–ด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.)

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณต๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋œป์ด์—์š”? ํŠน์ • Python ํ”„๋กœ์„ธ์Šค์—์„œ ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ ๊ฒฝ์šฐ Python์˜ ctypes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ / ์ „์—ญ BLIS ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์žฌ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณต๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋œป์ด์—์š”?

@ogrisel ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ BLIS์— OpenMP์˜ omp_get_num_threads() ๋ฐ omp_set_num_threads() ์™€ ์œ ์‚ฌํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ ์˜ค๋Š” ์ž‘์€ API๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ BLIS API ํ•จ์ˆ˜๋Š” getenv() ๋ฐ setenv() ํ˜ธ์ถœ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ BLIS์˜ ์›๋ž˜ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์…ธ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (์˜ˆ : bash )๋ฅผ ์„ค์ • ํ•œ ๋‹ค์Œ BLIS ์—ฐ๊ฒฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ

ํŠน์ • Python ํ”„๋กœ์„ธ์Šค์—์„œ ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ BLIS ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Python์˜ ctypes๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

BLIS๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์šฐ๋ฆฌ๋Š” pthread๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌ์„ฑ์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด create / join ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, BLIS๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (๋˜๋Š” ํ˜ธ์ถœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์€ ์ ์–ด๋„ ์›์น™์ ์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํŒŒ์ด์ฌ์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ • / ๊ฐ€์ ธ ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” BLIS๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฌ๋‚˜ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ •์„ ์™„๋ฃŒํ•˜๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ ˆ๋ฒจ 3 ์ž‘์—…์ด ํ˜ธ์ถœ ๋  ๋•Œ ํ˜ธ์ถœ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ‘๋ ฌํ™” ์ฒด๊ณ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋จผ์ € ์ž‘์€ struct ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œ struct ๋ฅผ gemm ์— ๋Œ€ํ•œ BLIS API์˜ ํ™•์žฅ ๋œ "์ „๋ฌธ๊ฐ€"๋ฒ„์ „์— ์ „๋‹ฌํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.) ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ณ„ ์ „๋ฌธ๊ฐ€ API๋Š” ํฅ๋ฏธ๋กญ์ง€ ๋งŒ Python ์ˆ˜์ค€ ํ˜ธ์ถœ์ž์—๊ฒŒ์ด๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • API๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด numpy๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. numpy ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ „์—ญ (ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€) ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์ด ํ›„์† BLAS-3 ํ˜ธ์ถœ์„ ๊ณ ๋ คํ•˜๋Š” ํ•œ env ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ๊ฐœ์ธ์ ์œผ๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@charris float16์€ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ด ์—†์ง€๋งŒ ์ ์–ด๋„ ์˜ˆ์ธก ์‹œ๊ฐ„์—๋Š” ์ผ๋ถ€ ๊ธฐ๊ณ„ ํ•™์Šต ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

numpy ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ „์—ญ (ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€) ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ˆ˜์ค€์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์ด ํ›„์† BLAS-3 ํ˜ธ์ถœ์„ ๊ณ ๋ คํ•˜๋Š” ํ•œ env ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ๊ฐœ์ธ์ ์œผ๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•Œ์•„ ๋‘˜๋งŒ ํ•œ. ๊ทธ๋ ‡๋‹ค๋ฉด BLIS๋Š” numpy๊ฐ€ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์— ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. (์ด์ „์— ์ด๋Ÿฌํ•œ ์ง„ํ–‰์ค‘์ธ ์ˆ˜์ •์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด์ „์— ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

getenv ๋Š” ๋งค์šฐ ๋น ๋ฅด์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚˜์ค‘์— ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํ˜ธ์ถœ์—์„œ ๋‹ค์‹œ ๊ฒ€์‚ฌ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?)ํ•˜์ง€๋งŒ bli_thread_set_num_threads API ํ˜ธ์ถœ์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. BLIS๊ฐ€ ํ•ญ์ƒ getenv ํ˜ธ์ถœ์„ ์ค‘์ง€ํ•˜๋”๋ผ๋„ API๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์„ ๊ณ„์†ํ•˜๋„๋ก ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ๊ธฐ์ ์œผ๋กœ ๋ณด๋ฉด numpy์—์„œ ๋ฒ ์–ด BLAS API๋ฅผ ์ผ๋ถ€ ๊ณต๊ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. BLIS๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” strided ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ BLAS API๋ฅผ ํ™•์žฅํ•˜๊ธฐ์œ„ํ•œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š”

numpy์˜ API์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ (์˜ˆ : np.matmul ๊ฐ€ BLIS์˜ JC, IC, JR ๋ฐ IR ๋งค๊ฐœ ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์ธ์ˆ˜๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค),ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ "์ด ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜"์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€๋Š” ์ธ๋ฑ์Šค ์ •๋ฐ€๋„์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ ์ œ๊ณต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” 32 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ด๋Š” ์š”์ฆ˜ ์ผ๋ถ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ ๋ชจ๋“  ์ธ๋ฑ์Šค๊ฐ€ 64 ๋น„ํŠธ์ด๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ํฌ๊ธฐ์™€ ๊ด€๋ จํ•˜์—ฌ ํ˜„์žฌ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. @ matthew-brett ์—ฌ์ „ํžˆ 32 ๋น„ํŠธ ์ •์ˆ˜๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@charris BLIS์˜ ์ •์ˆ˜ ํฌ๊ธฐ๋Š” ๊ตฌ์„ฑ์‹œ 32 ๋น„ํŠธ ๋˜๋Š” 64 ๋น„ํŠธ๋กœ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ์ •์ˆ˜ ํฌ๊ธฐ์™€๋Š” ๋ณ„๋„๋กœ BLAS API์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ •์ˆ˜ ํฌ๊ธฐ๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ €๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๋‚œ์ฃผ์— ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์Šค๋ ˆ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— gemm ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋˜ ๋ˆ„๊ตฐ๊ฐ€์™€ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํ‘œ์ค€ blas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ œ์–ด๋Š” ์ž„์˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ ์‰ฌ์šด ์ „์—ญ ์„ค์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

@njsmith ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ํ˜ธ์ถœ ๋‹น ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ API๋„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์นœ๊ตฌ์—๊ฒŒ fa08e5e (๋˜๋Š” ํ•ด๋‹น ์ปค๋ฐ‹์˜ ์ž์†)๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋ฌธ์„œ ๋„ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ๋ณธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ๋…์ž๊ฐ€ ์„ ํƒํ•œ ์‚ฌํ•ญ์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์€ ํ˜„์žฌ dev ๋ธŒ๋žœ์น˜์— ์žˆ์ง€๋งŒ ๊ณง master ์— ๋ณ‘ํ•ฉ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. (์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ์†๋„๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.)

ํŽธ์ง‘ : ์‚ฌ์†Œํ•œ ์ˆ˜์ • ์ปค๋ฐ‹์„ ๋ฐ˜์˜ํ•˜๋„๋ก ๋งํฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ์œ ํ˜•์— ๊ฐ€๋Šฅํ•œ ์ถ”๊ฐ€๋กœ long double ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ผ๋ถ€ ์•„ํ‚คํ…์ฒ˜๊ฐ€ (์—ฌ์ „ํžˆ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ) 4 ์ค‘ ์ •๋ฐ€๋„๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋Š ์‹œ์ ์—์„œ ํ™•์žฅ ์ •๋ฐ€๋„๊ฐ€ ์ธํ…”์—์„œ 4 ์ค‘ ์ •๋ฐ€๋„๋กœ ๋Œ€์ฒด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์žฅ ์‹œ๊ธ‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์ˆ˜๋…„์ด ์ง€๋‚˜๋ฉด ์ผ์ด ๊ทธ๋ ‡๊ฒŒ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@charris ์šฐ๋ฆฌ๋Š” ํŠนํžˆ ๊ธฐ๊ณ„ ํ•™์Šต / AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋•Œ๋ฌธ์— bfloat16 ๋ฐ / ๋˜๋Š” float16 ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ณ ๋ คํ•˜๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์žˆ์ง€๋งŒ double double ๋Œ€ํ•œ ์ˆ˜์š”๋„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@charris https://en.wikipedia.org/wiki/Long_double ์— ๋”ฐ๋ฅด๋ฉด long double ๋Š” ๋‹ค์–‘ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • x87์—์„œ ๊ตฌํ˜„ ๋œ 80 ๋น„ํŠธ ์œ ํ˜•, 12B ๋˜๋Š” 16B ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ
  • MSVC๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฐ์ • ๋ฐ€๋„
  • ๋ฐฐ์ • ๋ฐ€๋„
  • 4 ๋ฐฐ ์ •๋ฐ€๋„
    ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•˜๊ณ  ํ•˜๋“œ์›จ์–ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ABI๊ฐ€ ์ž˜ ์ •์˜๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์žฌ์•™์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ SIMD ๋ฒ„์ „์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— float80 (์˜ˆ : x87 long double)์— ๋Œ€ํ•œ ์ƒ์Šน์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. BLIS์—์„œ double double ์˜ SIMD ๋ฒ„์ „์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด์˜ float128 ๊ตฌํ˜„์€ ํ•˜๋“œ์›จ์–ด์˜ float64๋ณด๋‹ค ์ ์–ด๋„ ํฌ๊ธฐ๊ฐ€ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  FPE ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๊ณ  SIMD๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” float128์˜ ์ƒˆ๋กœ์šด ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช… ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. libquadmath์˜ ๊ตฌํ˜„์€ ์ •ํ™•ํ•˜์ง€๋งŒ BLIS์™€ ๊ฐ™์€ ๊ณ ์„ฑ๋Šฅ BLAS ๊ตฌํ˜„์˜ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๋œ ์ •๋ฐ€๋„๋Š” ๋…ธ๋ ฅํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  4 ์ค‘ ์ •๋ฐ€๋„์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์€ ๋ฐ˜์ ์ด ์žˆ๊ณ , double์€ ๋Œ€๋ถ€๋ถ„์˜ ์ผ์— ์ข‹์ง€๋งŒ ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ์†๋„๊ฐ€ ์•„๋‹ˆ๋ผ ์ •ํ™•์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌํ˜„ ์ธ 4 ์ค‘ ์ •๋ฐ€๋„ long double์„ ์‚ฌ์šฉํ•˜์—ฌ ARM64์— ๋Œ€ํ•œ ์ง€์›์„ ํ™•์žฅํ–ˆ์ง€๋งŒ, ํ•˜๋“œ์›จ์–ด๊ฐ€ ์–ด๋Š ์‹œ์ ์—์„œ ๋”ฐ๋ฅผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๊ธฐ๋ก์„ ์œ„ํ•ด @njsmith ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์Šค๋ ˆ๋”ฉ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ๋žŒ์„ ์–ธ๊ธ‰ ํ•œ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์›Œํฌ๋กœ๋“œ๋Š” ์˜ˆ์ธก ์‹œ๊ฐ„์— ๋‹นํ™ฉ ํ•  ์ •๋„๋กœ ๋ณ‘๋ ฌ ์ ์ด๋ฉฐ ํ–‰๋ ฌ ๊ณฑ์…ˆ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋” ํฐ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ฝ 1 ๋…„ ์ „์— PyPi ์šฉ Blis๋ฅผ ํŒจํ‚ค์ง•ํ•˜๊ณ  Cython ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/explosion/cython-blis

Blis๋Š” ์ด์™€ ๊ฐ™์€ C ํ™•์žฅ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ ๊ฐ€์žฅ ํฐ ๊ฑธ๋ฆผ๋Œ์€ Windows ์ง€์›์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์–ต์œผ๋กœ๋Š” C99 ๋ฌธ์ œ ์˜€์ง€๋งŒ ์ž˜๋ชป ๊ธฐ์–ตํ•˜๊ณ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ถ”๊ฐ€ ํ•œ Cython ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Cython์˜ ์œตํ•ฉ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ float ๋ฐ double ์œ ํ˜• ๋ชจ๋‘์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ทฐ ๋˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ผ nogil ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์œ ํ˜•์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๋ถ„๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ ๋œ ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์‹œ ์กฐ๊ฑด๋ถ€ ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜์—ฌ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋…๋ฆฝํ˜• Blis ํŒจํ‚ค์ง€๋ฅผ ์œ ์ง€ํ•˜๊ณ , ๋ฐ”ํ€ด๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฉ‹์ง„ Cython ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋“ฑ ๋งค์šฐ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ numpy ๋‚ด์— ํ†ตํ•ฉ ๋œ ๊ฒƒ๋ณด๋‹ค ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ์ œํ•œ์„๋ฐ›์ง€ ์•Š๊ณ  Blis์˜ API๋ฅผ ๋” ๋งŽ์ด ๋…ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@honnibal ์ด ์Šค๋ ˆ๋“œ์—์„œ ์‘๋‹ต์ด ์ง€์—ฐ๋˜์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, Matthew.

๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ์ค˜์„œ ๊ณ ๋งˆ์›Œ์š”. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด BLIS์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•˜๋Š” ๊ฒƒ์„ ํ•ญ์ƒ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Python ์ƒํƒœ๊ณ„ (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋ชจ๋“ˆ ๋“ฑ)์— ์ถ”๊ฐ€๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์กฐ์–ธ ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Windows ์ง€์›์— ๋Œ€ํ•ด์„œ๋Š” @isuruf๊ฐ€ ์ตœ๊ทผ์— ์ถ”๊ฐ€ ํ•œ Windows ABI์— ๋Œ€ํ•œ clang / appveyor ์ง€์›์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ์—๊ฒŒ์„œ ๋“ค์—ˆ์„ ๋•Œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ UT์—์„œ Windows์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (Isuru๊ฐ€ ํ•œ๋•Œ Travis CI์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ appveyor์— ๊ฐ€์ž… ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์ง€๋งŒ)

๋˜ํ•œ ํ†ตํ™” ๋ณ„ ์Šค๋ ˆ๋”ฉ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. (์ด ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.)

BLIS 0.5.2๋ถ€ํ„ฐ๋Š” Marvell ThunderX2๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๋งŽ์€ ์ฝ”์–ด ์•„ํ‚คํ…์ฒ˜์—์„œ ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ์œ ํ˜• ์„ธํŠธ์™€ ๋ ˆ๋ฒจ 3 ์ž‘์—…์— ๋Œ€ํ•œ BLIS์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ฐ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์„ฑ๋Šฅ๊ณผ BLAS์˜ ๊ธฐํƒ€ ๊ตฌํ˜„์„ ๋ณด์—ฌ์ฃผ๋Š” ์„ฑ๋Šฅ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. , Intel Skylake-X, Intel Haswell ๋ฐ AMD Epyc.

๋”ฐ๋ผ์„œ numpy ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ BLIS๊ฐ€ ๋‹ค๋ฅธ ์„ ๋„์  ์ธ BLAS ์†”๋ฃจ์…˜๊ณผ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ดํ•œ๋‹ค๋ฉด ๊ฐ„๋‹จํžˆ ์‚ดํŽด ๋ณด๋„๋ก ๊ถŒํ•ฉ๋‹ˆ๋‹ค!

๋งค์šฐ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. @fgvanzee์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Epyc์„ ์ฐพ์•„์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. Zen (์–ธ์  ๊ฐ€๋Š” Zen +๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ธŒ๋žœ๋“œ ์ด๋ฆ„ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Zen์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ Ryzen / Threadripper๋Š” ๋” ํฅ๋ฏธ๋กœ์šด ๋ธŒ๋žœ๋“œ์ž…๋‹ˆ๋‹ค. Zen์€ ์ธ์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Epyc์€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Epyc๋Š” AMD ์„œ๋ฒ„ ๋ผ์ธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ AMD Opteron ์ œํ’ˆ์˜ ํ›„์† ์ œํ’ˆ์ž…๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ BLIS๊ฐ€ ์•„ํ‚คํ…์ฒ˜ ํƒ€๊ฒŸ์— ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ณ ์œ  ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ฒกํ„ฐ ISA (์˜ˆ : AVX2), CPU ์ฝ”์–ด ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜ (์˜ˆ : Ice Lake) ๋ฐ SOC / ํ”Œ๋žซํผ ํ†ตํ•ฉ (์˜ˆ : Intel Xeon Platinum ํ”„๋กœ์„ธ์„œ)์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ). BLIS๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ (์˜ˆ : Dunnington) ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜ ์ฝ”๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋” ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@fgvanzee GCC march / mtune / mcpu ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rgommers Ryzen ๋ฐ Epyc์„ ํฌํ•จํ•˜๋Š” BLIS ๋‚ด์˜ ํ•˜์œ„ ๊ตฌ์„ฑ์€ ๋‘ ์ œํ’ˆ์„ ๋ชจ๋‘ ์บก์ฒ˜ํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ด๋ฏธ zen ์ด๋ฆ„์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Ryzen / Threadripper ๋˜๋Š” Epyc์ด ๋” ํฅ๋ฏธ๋กœ์šด ๋ธŒ๋žœ๋“œ์ธ์ง€์— ๊ด€ํ•ด์„œ๋Š” (์ˆ˜๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋„) ์ด๋ ‡๊ฒŒ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ AMD Zen ์‹œ์Šคํ…œ ๋งŒ ๋ฒค์น˜ ๋งˆํฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ตœ๊ณ ๊ธ‰ Epyc์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Ryzen๊ณผ ์œ ์‚ฌํ•œ ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (b) ์ตœ๋Œ€ 64 ๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ์ฝ”์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ฝ”์–ด๋Š” ๋‹ค์†Œ ์ฐธ์‹ ํ•œ NUMA์™€ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์œผ๋กœ ๋ฐฐ์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค). (c) BLIS ๋ฐ ๊ธฐํƒ€ ๊ตฌํ˜„์— ์ตœ๋Œ€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ณ ๋ง™๊ฒŒ๋„ ํ•˜๋‚˜์˜ Zen ์‹œ์Šคํ…œ ๋งŒ ๋ฒค์น˜๋งˆํ‚น ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ทœ์น™์ด ์—†์Šต๋‹ˆ๋‹ค. :) ๊ทธ๋Ÿฌ๋‚˜, ํŠนํžˆ ์ฒ˜์Œ์— ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค๋ฅธ ์žฅ์• ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Ryzen / Threadripper ์‹œ์Šคํ…œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์‹คํ—˜์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Jeff๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉด ํ•œ ์ด๋ฆ„ ์ง€์ • ํ•จ์ • ์ค‘ ์ผ๋ถ€๋ฅผ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ํ•˜์œ„ ๊ตฌ์„ฑ ๋ฐ ์ปค๋„ ์ง‘ํ•ฉ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€๋งŒ ์•„์ง ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Haswell, Broadwell, Skylake, Kaby Lake ๋ฐ Coffee Lake์—์„œ haswell ํ•˜์œ„ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ BLIS ์ปค๋„ ์ฝ”๋“œ๊ฐ€ ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋™์ผํ•œ ๋ฒกํ„ฐ ISA๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€์—†๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ./configure auto ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„์ด zen ์ด๋“  haswell ์ด๋“  ์ƒ๊ด€์—†์ด ๊ฑฐ์˜ ํ•ญ์ƒ ์‹œ์Šคํ…œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ•˜์œ„ ๊ตฌ์„ฑ ๋ฐ ์ปค๋„ ์„ธํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์Šค๋ ˆ๋”ฉ ์ฒด๊ณ„๋ฅผ ์ตœ์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋ฐ์žˆ์–ด ๋” ๋งŽ์€ ์‹ค์Šต ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ด์•ผํ•˜๋ฉฐ, ์—ฌ๊ธฐ์—์„œ Jeff๊ฐ€ ์–ธ๊ธ‰ ํ•œ SoC / ํ”Œ๋žซํผ ํ†ตํ•ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@jeffhammond ์ œ์•ˆ config ๋””๋ ‰ํ† ๋ฆฌ)์˜ ์ด๋ฆ„. ์ด์ œ BLIS๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด ./configure haswell ๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ๊ตฌ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์‹๋ณ„ํ•ด์•ผํ•œ๋‹ค๋ฉด ์Šค์ผ€์ผ์ด ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ์œ ๋ฆฌํ•˜๊ฒŒ ํŒ์„ ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ./configure auto ์€ (๋Š”) ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์›ํ•œ๋‹ค๋ฉด์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›๋“ค ์‚ฌ์ด์—์„œ ๋” ๋„“์€ ํ† ๋ก ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํ•œ ์ˆ˜์š”๊ฐ€ ์žˆ์œผ๋ฉด ํ•ญ์ƒ ๋งˆ์Œ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์˜ˆ, ์ด๋ฆ„ ์ง€์ •์€ ํ•ญ์ƒ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.) @fgvanzee ๋ฐ @jeffhammond ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# 13132์™€ โ€‹โ€‹# 13158์€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ๋ก ์€ ์กฐ๊ธˆ ์žŠํ˜€์กŒ์Šต๋‹ˆ๋‹ค. numpy์—์„œ BLIS๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ˆœ์ง„ํ•˜๊ฒŒ, ๋‚˜๋Š” conda-forge (cf https://github.com/numpy/numpy/issues/14180#issuecomment-525292558)์—์„œ BLIS๋กœ numpy ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ๋‚˜์—๊ฒŒ๋Š” Linux์—์„œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๋‚˜๋Š” ๋†“์นœ ๊ฒƒ).

๋˜ํ•œ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ scipy ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด์žˆ๋Š” ๊ฒฝ์šฐ scipy.linalg (cf https://github.com/scipy/scipy/issues/10744 ์ฐธ์กฐ)์— ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ.

conda-forge์˜ BLIS๋Š” libflame ์•„๋‹ˆ๋ผ BLIS๋ฅผ BLAS ๊ตฌํ˜„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” LAPACK ๊ตฌํ˜„์œผ๋กœ ReferenceLAPACK (netlib)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

conda-forge์˜ BLIS ์˜ต์…˜์— ๋Œ€ํ•ด OpenBLAS ์˜ต์…˜๊ณผ ๋‹ฌ๋ฆฌ ์ƒ์ž์—์„œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ?

conda-forge ํ† ๋ก ์„ conda-forge๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋งˆ๋„ ๋” ์ข‹์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

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