Lapack: ํ‘œ์ค€ index-32 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ index-64 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 11์›” 01์ผ  ยท  41์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Reference-LAPACK/lapack

ํ˜„์žฌ ๋ฐ๋น„์•ˆ์—๋Š” blas64 ๋ฐ cblas64์— ๋Œ€ํ•œ (์ผ๋ถ€) ๋ณ„๋„์˜ ํ—ค๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ ๊ตฌํ˜„์—์„œ๋Š” ์•„๋‹˜).

์ฐธ์กฐ index64 API(blis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ด)์™€ ๊ด€๋ จํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

cmake์— BUILD_INDEX64 ์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ๊ฐ’์€ OFF ์ด์ง€๋งŒ ์ผœ์ ธ ์žˆ์œผ๋ฉด index-64 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๊นŒ?
๊ทธ๋Ÿฐ ์„ ํƒ์ง€๋ฅผ PRํ•˜๋ฉด ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์—ฌ๊ธธ๊นŒ?

์ด๊ฒƒ์ด ํ‘œ์ค€ ์„ค์น˜์™€ ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์„ libblas64.so, libcblas64.so, liblapack64.so, liblapacke64.so ์ง€์ •ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„ ๊ฐ„์— ์ถฉ๋Œ์ด ์—†์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋งํฌํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ libblas์™€ libblas64๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉ).
๋˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” index32์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ, index64์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ, ๋‘ ๋ฒˆ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์™„์ „ํžˆ ์ •์ƒ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋ฉฐ ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).
์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์ถฉ๋Œ์€ ํ—ค๋” ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
๋ฐ๋น„์•ˆ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ 64๋กœ ๋๋‚˜๋Š” c ํ—ค๋”๋„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์ €๋Š” Gentoo๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒํƒœ๊ณ„๋ฅผ ๋ฐ๋น„์•ˆ์— ๋งค์šฐ ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹œ์Šคํ…œ ๊ฐ„์— ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค)

๋‚˜๋Š” PR์„ ํ•˜๊ธฐ ์ „์— ์–ด๋–ค ์ œ์•ˆ์ด๋“  ์—ด๋ ค์žˆ์Šต๋‹ˆ๋‹ค :heart:

๊ฐ์‚ฌ ํ•ด์š”,
์•„์ด์ƒค

Build System Enhancement

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

์•ˆ๋…• Aisha, ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์™„์ „ํžˆ ์ดํ•ด๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋ฉฐ์น ๋งŒ ๊ธฐ๋‹ค๋ฆฌ์ž. ์ œ์ด

ํ™•์‹คํžˆ, ๊ทธ๊ฒƒ์€ ์ข‹์€ ๊ณ„ํš์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์„ธ์ƒ์— @langou
๋‹น์‹ ์€ ๋„ˆ๋ฌด ๋น ๋ฆ…๋‹ˆ๋‹ค : ์‹ฌ์žฅ :

์™„์ „์„ฑ์„ ์œ„ํ•ด, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ํ•ด์•ผ ํ•  ์ผ๋“ค์„ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • 32๋น„ํŠธ API์™€ 64๋น„ํŠธ API๊ฐ€ ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ค๋” ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ
  • ์ธ์‡„์— ์˜ฌ๋ฐ”๋ฅธ ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก printf/fprintf ๋ฌธ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์š”์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ "๊นจ๋—ํ•œ" ์†”๋ฃจ์…˜์ด ์—†์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ •์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ

  • cblas_f77.h ์™€ cblas_test.h ์‚ฌ์ด์— ์ค‘๋ณต ์ •์˜๊ฐ€ ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”?
  • cblas_test.h ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ฆ„(๋ฐ ์‚ฌ์šฉ๋œ ํŒŒ์ผ)์„ ๊ฐ์•ˆํ•  ๋•Œ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ฐจ์›์—์„œ ์ด ํŒŒ์ผ์„ ์„ค์น˜ํ•˜๋ฉด ์•ˆ ๋ ๊นŒ์š”?

์•ˆ๋…•ํ•˜์„ธ์š” @epsilon-0

์ด๊ฒƒ์„ ํ‘œ์ค€ ์„ค์น˜์™€ ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์„ libblas64.so, libcblas64.so, liblapack64.so, liblapacke64.so๋กœ ์ง€์ •ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„ ์‚ฌ์ด์— ์ถฉ๋Œ์ด ์—†์Šต๋‹ˆ๋‹ค( ๋ฌผ๋ก  libblas์™€ libblas64๋ฅผ ๋™์‹œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ PR #218์„ ์ฐพ๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด PR์˜ ์ €์ž๋Š” Fedora Project์˜ Bjรถrn Esser์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @epsilon-0์ž…๋‹ˆ๋‹ค. #462๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ?

@weslleyspereira ์•„๋‹ˆ์š” ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํ—ค๋” ์ด๋ฆ„ ๋ณ€๊ฒฝ/์ฒ˜๋ฆฌ๊ฐ€ ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์•ž์œผ๋กœ ๋ช‡ ์ฃผ ๋™์•ˆ ๋ฐ”๋น ์„œ ์ด๊ฒƒ์„ ๊ณง ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๊ฐœ์š”

  • ํ—ค๋” ํŒŒ์ผ์€ ๋‹ค๋ฅธ ํ—ค๋”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ cblas.h ๋ฐ cblas64.h ๋ผ๊ณ  ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์€ *.c ํŒŒ์ผ์ด ์ ์ ˆํ•œ ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋™์•ˆ์—๋งŒ ํ•ด๋‹นํ•˜๋ฏ€๋กœ ํ•ดํ‚น๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • cmake ํŒŒ์ผ์€ lapack64 ๋˜๋Š” cblas64 ๋“ฑ์— ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ ์•Œ์•˜์–ด. ๋น ๋ฅธ ํ›„์† ์กฐ์น˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

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

/usr/lib/libopenblas.so
/usr/lib/libopenblas64.so
/usr/lib/libblas.so
/usr/lib/libcblas.so
/usr/lib/libblas64.so
/usr/lib/libcblas64.so
/usr/include/openblas/cblas.h
/usr/include/openblas64/cblas.h
/usr/include/netlib/cblas.h
/usr/include/netlib64/cblas.h
/usr/include/cblas.h -> netlib/cblas.h (for compatibility, having the default)

(๊ธฐํƒ€ ๋“ฑ๋“ฑ)

์šฐ๋ฆฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌํŒ๊ณผ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์ „ํ™˜์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ cblas.h(๋ฐ lapacke.h)๊ฐ€ libopenblas์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์ผ์น˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŠน์ •ํ•œ ๊ฒฝ์šฐ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ๊ฐ„ ์„ ํƒ์€ ๋‹ค์Œ์„ ํ†ตํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

BLAS_INCLUDES=-I/prefix/include/netlib64
BLAS_LIBS=-lblas64
CBLAS_LIBS=-lcblas64

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

ํ•˜์ง€๋งŒ ๊ทธ ํ—ค๋”์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

cmake ๋นŒ๋“œ๋ฅผ ํ•ดํ‚นํ•˜์—ฌ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ๋‹ค๋ฅธ ์ˆ˜์ •์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(https://github.com/Reference-LAPACK/lapack/pull/556 ์ฐธ์กฐ). libblas.so ๋ฐ libblas64.so ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž˜ ๋นŒ๋“œ๋˜๊ณ  ํ—ค๋” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„ค์น˜๋œ cblas.h ๋ฐ lapacke.h๋Š” 32๋น„ํŠธ ๋ฐ 64๋น„ํŠธ ์ธ๋ฑ์‹ฑ ๋ฒ„์ „์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ openblas์™€ ์ƒ์ถฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— netlib ๋นŒ๋“œ์—์„œ ๋ณผ ์ˆ˜ ์—†๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

diff -ruN /data/pkg/include/openblas/openblas_config.h /data/pkg/include/openblas64/openblas_config.h
--- /data/pkg/include/openblas/openblas_config.h    2021-06-03 19:03:53.000000000 +0200
+++ /data/pkg/include/openblas64/openblas_config.h  2021-06-03 19:13:36.000000000 +0200
@@ -44,6 +44,7 @@
 #define OPENBLAS_DLOCAL_BUFFER_SIZE 32768
 #define OPENBLAS_CLOCAL_BUFFER_SIZE 16384
 #define OPENBLAS_ZLOCAL_BUFFER_SIZE 12288
+#define OPENBLAS_USE64BITINT 
 #define OPENBLAS_GEMM_MULTITHREAD_THRESHOLD 4
 #define OPENBLAS_VERSION " OpenBLAS 0.3.15 "
 /*This is only for "make install" target.*/

์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ 32๋น„ํŠธ ๋ฐ 64๋น„ํŠธ ์ธ๋ฑ์Šค ๋นŒ๋“œ์˜ ๋ชจ๋“  ํ—ค๋”๊ฐ€ ๋™์ผํ•˜๋ฉฐ ๋ถ„๋ช…ํžˆ ์‚ฌ์šฉ์ž๋Š”
cblas.h ๋ฐ -DLAPACK_ILP64 -DHAVE_LAPACK_CONFIG_H ํ”Œ๋ž˜๊ทธ์˜ -DWeirdNEC (30๋…„ ์ „์—๋Š” ์žฌ๋ฏธ์žˆ์—ˆ์„ ์ˆ˜๋„ ์žˆ์Œ) . ์‚ฌ๋žŒ๋“ค์€ ํ”„๋กœ๋•์…˜์—์„œ ์ตœ์ ํ™”๋œ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ, IMHO ๋ฐ ILP64 ๋นŒ๋“œ์—์„œ ์„ค์น˜๋œ ํ—ค๋”์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ํ”ผ๋“œ๋ฐฑ์€ 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—ฐ๊ฒฐํ•  ๋•Œ ์•ฑ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŽ‘ํ‚ค ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ •์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์‹œ ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ?

Btw, ์„ค์น˜๋œ cblas ๊ตฌ์„ฑ ํŒŒ์ผ๋„ ํ•„์š”ํ•œ def์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ 64๋น„ํŠธ ์ธ๋ฑ์Šค ๋นŒ๋“œ์— ๋Œ€ํ•ด ์†์ƒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์‹ค, ๋‚˜๋Š” ์ด๊ฒƒ๋“ค์„ ์ „ํ˜€ ์„ค์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ .pc ํŒŒ์ผ๊ณผ ์ค‘๋ณต๋˜๋ฉฐ BLAS_LIBS etal์„ ํ†ตํ•ด ํŒจํ‚ค์ง€ ํ”„๋กœ๊ทธ๋žจ ์„ ํƒ์„ ์ˆ˜๋ฝํ•˜๋„๋ก cmake๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ข…์† ํŒจํ‚ค์ง€๋ฅผ ์„ค๋“ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์‹ : Intel MKL์—๋Š” ์ค‘์•™ ์Šค์œ„์น˜ -DMKL_ILP64 ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ์„ค์ •์„ ์ƒ์ƒํ•ด
include/intel-mkl64/cblas.h

#ifndef MKL_ILP64
#define MKL_ILP64
#endif
#include <mkl_cblas.h>

์ผ๋ฐ˜์ ์ธ ๊ณ„ํš์— ๋งž๊ฒŒ. ๋˜ํ•œ ์ด์ƒํ•œ netlib ์ •์˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ •์˜๋ฅผ BLAS_INCLUDES์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธํ…”์ฒ˜๋Ÿผ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด OpenBLAS์ฒ˜๋Ÿผ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

์˜ฌ๋ฐ”๋ฅธ ์ •์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์‹œ ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜๊ณ  ์ „์ฒด ํ—ค๋”๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

Btw, ์„ค์น˜๋œ cblas ๊ตฌ์„ฑ ํŒŒ์ผ๋„ ํ•„์š”ํ•œ def์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ 64๋น„ํŠธ ์ธ๋ฑ์Šค ๋นŒ๋“œ์— ๋Œ€ํ•ด ์†์ƒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ. ๋ฐฉ๊ธˆ 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(BUILD_INDEX64=ON)๋ฅผ ์„ค์น˜ํ–ˆ๋Š”๋ฐ WeirdNEC , LAPACK_ILP64 ๋˜๋Š” HAVE_LAPACK_CONFIG_H ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•Œ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์˜ˆ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜๊ณ  ์ „์ฒด ํ—ค๋”๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ๊ฐ€ ์ง€๊ธˆ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#if defined(WeirdNEC) || @HAVE_ILP64@
   #define CBLAS_INDEX long
   #ifndef WeirdNEC
   #define WeirdNEC
   #endif
#else
   #define CBLAS_INDEX int
#endif

CMakeFile์€ HAVE_ILP๋ฅผ 1 ๋˜๋Š” 0์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ ํ—ค๋”๋Š” ํ˜„์žฌ ๋นŒ๋“œ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

(Btw.: long์€ Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. stdint๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ long long ... ๋˜๋Š” int64_t์ž…๋‹ˆ๋‹ค.)

์˜ค๋ฅธ์ชฝ. ๋ฐฉ๊ธˆ 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(BUILD_INDEX64=ON)๋ฅผ ์„ค์น˜ํ–ˆ๋Š”๋ฐ WeirdNEC , LAPACK_ILP64 ๋˜๋Š” HAVE_LAPACK_CONFIG_H ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•Œ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹น์‹ ์ดํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

cc -I/foo/include/netlib64 -o bar bar.c -L/foo/lib -lcblas64

๊ทธ๋ฆฌ๊ณ  foo/include/netlib64/cblas.h์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด foo/include/netlib/cblas.h(foo/include/cblas.h์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ)์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์˜๋ฏธํ•œ ๊ฒƒ์ด _์•„๋‹™๋‹ˆ๋‹ค_ ๋ผ๋Š” ์˜์‹ฌ์ด ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ํ™•์‹ ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค;-)

/foo/include/cblas.h์— 'the' ํ—ค๋”๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  WeirdNEC๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ๋งŒ /foo/include/netlib64/cblas.h์— ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋„๋ก ํ•˜์—ฌ ํ—ค๋”๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” 64 ๋น„ํŠธ ๋ฐ 32๋น„ํŠธ ํŒจํ‚ค์ง€๋Š” ๊ณตํ†ต ํ—ค๋” ํŒŒ์ผ์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํŒจํ‚ค์ง•์ด ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์ด ํŒŒ์ผ์„ ๋ณ„๋„์˜ ์žฅ์†Œ/์ด๋ฆ„์— ๋„ฃ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. #include <cblas.h> ํ–‰์„ ๊ต์ฒดํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์€ cblas.h๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ cblas.h๊ฐ€ ../cblas.h๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ cmake์— ๋Œ€ํ•œ _one_ ํ—ค๋” ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ /foo/netlib64/include๊ฐ€ ์•„๋‹ˆ๋ผ /foo/include์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(pkgsrc์—์„œ BSD make):

.if !empty(LAPACK_COMPONENT:M*64)
.  if empty(MACHINE_ARCH:M*64)
PKG_FAIL_REASON+=       "${LAPACK_COMPONENT} incompatible with non-64-bit platform"
.  endif
HEADERDIR=netlib64
.else
HEADERDIR=netlib
.endif

# Note: We patch the build to install both static and
# shared libraries.
CMAKE_ARGS=     -DBUILD_DEPRECATED=ON \
                -DBUILD_SHARED_LIBS=ON \
                -DBUILD_STATIC_LIBS=ON \
                -DCMAKE_INSTALL_INCLUDEDIR=${PREFIX}/include/${HEADERDIR} \
                ${LAPACK_COMPONENT_CMAKE_ARGS}

32๋น„ํŠธ cblas.h๋ฅผ ์ผ๋ฐ˜์ ์ธ ์œ„์น˜๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐฐ์†ก/์„ค์น˜ํ•˜๋Š” ๊ฒƒ์˜ ์•„๋ฆ„๋‹ค์šด ์ธก๋ฉด์€ ์›๋ž˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ณ€ํ˜•๋งŒ WeirdNEC๋ฅผ ์‹œํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ์— 64๋น„ํŠธ๋งŒ ์„ค์น˜ํ•˜๊ณ  ์ƒํƒœ๊ณ„์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค, ์–ด์„œ ... CBLAS/cmake/cblas-config-install.cmake.in์ด -DCMAKE_INSTALL_INCLUDEDIR์„ ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‚˜์š”?

# Report lapacke header search locations.
set(CBLAS_INCLUDE_DIRS ${_CBLAS_PREFIX}/include)

(๋Œ“๊ธ€์€ ์œ„์— ์„คํƒ•์ž…๋‹ˆ๋‹ค.)

CMake ๋นŒ๋“œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ํ›จ์”ฌ ๋œ ์„ฑ์ˆ™ํ•˜๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ธฐ๋ณธ ๋นŒ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ง„์ง€ํ•œ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋“œ๋ผ์ด๋ธŒ ๋ฐ”์ด ๊ธฐ์—ฌ์ธ๊ฐ€์š”? ์ €๋Š” ์˜ˆ์ „ ์Šคํƒ€์ผ์˜ Makefile์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๊ณ , ์†Œ๋ž€๋„ ๋œ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” CMake๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์—ฌ ์–ด์จŒ๋“  ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ ํฌ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ... ์œ„์— ํ‘œ์‹œ๋œ๋Œ€๋กœ cblas.h๋ฅผ cblas.h.in์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cblas.h.in cblas.h @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cblas_f77.h.in cblas_f77.h @ONLY)

CBLAS/include/CMakeLists.txt๋กœ, ๋˜ํ•œ ์ตœ์ƒ์œ„ CMakeLists.txt์—์„œ @HAVE_ILP64@ ๋ฅผ 1 ๋˜๋Š” 0์œผ๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํ‰์ƒ ๋™์•ˆ ๋” ๋†’์€ ์ˆ˜์ค€์˜ CMakeLists.txt์— ์žˆ๋Š” ์„ค์น˜ ํ•ญ๋ชฉ์„ ์ƒ์„ฑ๋œ ํ—ค๋” ๋˜๋Š” ${LAPACK_BINARY_DIR}/include ์—์„œ ๋™์ผํ•œ ์ด์ƒํ•œ ๋ณต์‚ฌ๋ณธ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ •๋ง? A ์†Œ์Šค ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ณต์‚ฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?)

๋งคํฌ๋กœ append_subdir_files๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ—ค๋” ๊ฒฝ๋กœ์— ์ ‘๋‘์‚ฌ ์‚ฌ๋ณธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ํ—ค๋” ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. HERE์—์„œ THERE๋กœ ํ—ค๋” ํŒŒ์ผ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์  ์žฅ.

์ง€์‹์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์—ฌ๊ธฐ์—์„œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด์ผ์ด๋ฉด ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๊ฐ์ •์  ์•ˆ๋„๊ฐ์„ ์œ„ํ•ด ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ ๋Š” ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜๊ณ  ์ „์ฒด ํ—ค๋”๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ๊ฐ€ ์ง€๊ธˆ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#if defined(WeirdNEC) || @HAVE_ILP64@
   #define CBLAS_INDEX long
   #ifndef WeirdNEC
   #define WeirdNEC
   #endif
#else
   #define CBLAS_INDEX int
#endif

CMakeFile์€ HAVE_ILP๋ฅผ 1 ๋˜๋Š” 0์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ ํ—ค๋”๋Š” ํ˜„์žฌ ๋นŒ๋“œ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

(Btw.: long์€ Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. stdint๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ long long ... ๋˜๋Š” int64_t์ž…๋‹ˆ๋‹ค.)

์˜ค๋ฅธ์ชฝ. ๋ฐฉ๊ธˆ 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(BUILD_INDEX64=ON)๋ฅผ ์„ค์น˜ํ–ˆ๋Š”๋ฐ WeirdNEC , LAPACK_ILP64 ๋˜๋Š” HAVE_LAPACK_CONFIG_H ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•Œ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹น์‹ ์ดํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

cc -I/foo/include/netlib64 -o bar bar.c -L/foo/lib -lcblas64

๊ทธ๋ฆฌ๊ณ  foo/include/netlib64/cblas.h์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด foo/include/netlib/cblas.h(foo/include/cblas.h์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ)์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์˜๋ฏธํ•œ ๊ฒƒ์ด _์•„๋‹™๋‹ˆ๋‹ค_ ๋ผ๋Š” ์˜์‹ฌ์ด ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ํ™•์‹ ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค;-)

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์›๋ž˜ ํ—ค๋” cblas.h ํ•˜๊ณ  include/netlib64/cblas.h ๋ฐ include/netlib/cblas.h ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

#if defined(WeirdNEC)
   #define WeirdNEC
#endif
#include <cblas.h>

/foo/include/cblas.h์— 'the' ํ—ค๋”๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  WeirdNEC๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ๋งŒ /foo/include/netlib64/cblas.h์— ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋„๋ก ํ•˜์—ฌ ํ—ค๋”๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” 64 ๋น„ํŠธ ๋ฐ 32๋น„ํŠธ ํŒจํ‚ค์ง€๋Š” ๊ณตํ†ต ํ—ค๋” ํŒŒ์ผ์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํŒจํ‚ค์ง•์ด ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์ด ํŒŒ์ผ์„ ๋ณ„๋„์˜ ์žฅ์†Œ/์ด๋ฆ„์— ๋„ฃ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. #include <cblas.h> ํ–‰์„ ๊ต์ฒดํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์€ cblas.h๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ cblas.h๊ฐ€ ../cblas.h๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ cmake์— ๋Œ€ํ•œ _one_ ํ—ค๋” ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ˆ, ํ•œ ํ—ค๋”์— ๋‹ค๋ฅธ ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด include/netlib64 ๋ฐ include ๋ฅผ ํฌํ•จ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ /foo/netlib64/include๊ฐ€ ์•„๋‹ˆ๋ผ /foo/include์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(pkgsrc์—์„œ BSD make):

.if !empty(LAPACK_COMPONENT:M*64)
.  if empty(MACHINE_ARCH:M*64)
PKG_FAIL_REASON+=       "${LAPACK_COMPONENT} incompatible with non-64-bit platform"
.  endif
HEADERDIR=netlib64
.else
HEADERDIR=netlib
.endif

# Note: We patch the build to install both static and
# shared libraries.
CMAKE_ARGS=     -DBUILD_DEPRECATED=ON \
                -DBUILD_SHARED_LIBS=ON \
                -DBUILD_STATIC_LIBS=ON \
                -DCMAKE_INSTALL_INCLUDEDIR=${PREFIX}/include/${HEADERDIR} \
                ${LAPACK_COMPONENT_CMAKE_ARGS}

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ _์ถ”์ธก_ํ•  ํ•„์š” ์—†์ด LAPACK์„ ๋นŒ๋“œํ•˜๋Š” ๋Œ€์•ˆ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ์˜ ๋ฐฉ์‹๋„ ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(Btw.: long์€ Windows์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. stdint๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ long long ... ๋˜๋Š” int64_t์ž…๋‹ˆ๋‹ค.)

์•Œ์•„ ๋‘˜๋งŒ ํ•œ. BLAS++ ๋ฐ LAPACK++๋Š” long long ๋Œ€์‹  int64_t๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@weslleyspereira ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ฒ˜์Œ์— ์ด ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค:

#if defined(WeirdNEC)
   #define WeirdNEC
#endif
#include "../cblas.h"

/prefix/include/cblas.h ๋ฐ /prefix/include/netlib64/cblas.h๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›„์ž๊ฐ€ ์ „์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ 64๋น„ํŠธ ๋นŒ๋“œ์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์€ ํ—ค๋”๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ•๋ ฅํ•œ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

#if defined(WeirdNEC) || @HAVE_ILP64@
   #define CBLAS_INDEX long
   #ifndef WeirdNEC
   #define WeirdNEC
   #endif
#else
   #define CBLAS_INDEX int
#endif

(long vs. int64๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ง€๋งŒ, ์ €๋Š” BLAS++์ฒ˜๋Ÿผ ๊ทธ ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค)

์  ์žฅ, `#include ".../cblas.h"๊ฐ€ ๋‹ค๋ฅธ ๋“ค์—ฌ์“ฐ๊ธฐ๋œ ํ—ค๋”๋งŒ ์ฐพ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. C ํ‘œ์ค€์€ ๊ฒ€์ƒ‰ ์ˆœ์„œ๊ฐ€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์ •์˜๋˜๋ฉฐ ๋ฐ˜๋“œ์‹œ ํ˜„์žฌ ํ—ค๋”์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ €๋กœ์„œ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ํ•ด๋‹น ๊ณตํ†ต ํ—ค๋”์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ 64๋น„ํŠธ ํŒจํ‚ค์ง€๊ฐ€ 32๋น„ํŠธ ํŒจํ‚ค์ง€์— ์ข…์†๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์งœ์ฆ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์—…์ŠคํŠธ๋ฆผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ pkgsrc์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ—ค๋”( -DNETLIB_INDEX_BITS=64 ?)์™€ ํ•จ๊ป˜ ๋ช…์‹œ์ ์œผ๋กœ 32๋น„ํŠธ ์ธ๋ฑ์Šค ๋˜๋Š” 64๋น„ํŠธ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐํ˜ธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ์†”๋ฃจ์…˜์ด ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

lib/libcblas64.so
include/optional_subdir64/cblas.h

๊ทธ๋ฆฌ๊ณ 

lib/libcblas.so
include/optional_subdir/cblas.h

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

๊ทธ๋Ÿฐ ๋‹ค์Œ pkgsrc์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค(๋งˆ๊ฐ ์ž„๋ฐ•) ์ „์— ์ด๋ฅผ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒˆ LAPACK ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ์—ฌ๊ธฐ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ‘ํ•ฉํ•œ ํ›„ ํŒจ์น˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋” ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ผ๋ฐ˜ Makefile ๋นŒ๋“œ๋„ ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ CMake ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ _my_ ํŒจ์น˜์—๋Š” ์•„์ง ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(๊ทธ ์ด์ƒํ•œ CMake ๋นŒ๋“œ๋ฅผ ์ œ์ถœ๋กœ ์ด๊ธฐ๋ ค๊ณ  ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ๋“  ๋‚ด ์„ฑ์งˆ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋นŒ๋“œ ๋””๋ ‰ํ† ๋ฆฌ ์ฃผ๋ณ€์˜ ํ—ค๋” ๋ณต์‚ฌ๋ณธ์„ ์„ž์€ ๋‹ค์Œ ์„ค์น˜๋ฅผ ์œ„ํ•ด ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๊นจ์ง„ .cmake ํŒŒ์ผ์— ๋Œ€ํ•ด ๊ฒฐ์ •ํ•˜์‹ญ์‹œ์˜ค. ์•„๋งˆ๋„ ์„ค์น˜์—์„œ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค ... ์šฐ๋ฆฌ๋Š” pkg-config๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค!)

์•„๋ฌด๊ฒƒ? ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๊ตฌํ˜„์ธ openblas์— ์˜ํ•ด ์„ค์ •๋œ ์˜ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๊ธฐํšŒ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ…”์ด 64๋น„ํŠธ/32๋น„ํŠธ ์ธ๋ฑ์Šค ํ—ค๋”์— ๋Œ€ํ•œ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ–๋„๋ก ์„ค๋“ํ•˜๋Š” ๊ฒƒ๋„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

include/mkl-blas/cblas.h
include/mkl-blas64/cblas.h

ํ˜„์žฌ, cblas์™€ cblas64๊ฐ€ ๋™์ผํ•œ ํ—ค๋”๋ฅผ ์„ค์น˜ํ•˜๋Š” ์žฌ๋ฏธ์žˆ๋Š” -DWeirdNEC -DHAVE_LAPACK_CONFIG_H -DLAPACK_ILP64 ๋ผ์ธ์ด ์žˆ๋Š” ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด pkgsrc์— ๊ธฐ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋นŒ๋“œ ABI์™€ ์ผ์น˜ํ•˜๋„๋ก ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@weslleyspereira ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ฒ˜์Œ์— ์ด ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค:

#if defined(WeirdNEC)
   #define WeirdNEC
#endif
#include "../cblas.h"

/prefix/include/cblas.h ๋ฐ /prefix/include/netlib64/cblas.h๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›„์ž๊ฐ€ ์ „์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ 64๋น„ํŠธ ๋นŒ๋“œ์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์€ ํ—ค๋”๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ•๋ ฅํ•œ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

#if defined(WeirdNEC) || @HAVE_ILP64@
   #define CBLAS_INDEX long
   #ifndef WeirdNEC
   #define WeirdNEC
   #endif
#else
   #define CBLAS_INDEX int
#endif

๊ทธ๋ž˜ ๊ทธ๊ฑฐ์•ผ. 32๋น„ํŠธ ๋ฐ 64๋น„ํŠธ ํ—ค๋”์— ๋Œ€ํ•œ ํ•˜์œ„ ํด๋”๋ฅผ ๊ฐ–๋Š” ์†”๋ฃจ์…˜์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ @langou ์™€ ๋…ผ์˜ํ–ˆ๊ณ  ๊ทธ๋„ ์ด๊ฒƒ์ด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

(long vs. int64๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ง€๋งŒ, ์ €๋Š” BLAS++์ฒ˜๋Ÿผ ๊ทธ ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค)

์˜ค๋ฅธ์ชฝ. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ๋‹ค๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์—…์ŠคํŠธ๋ฆผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ pkgsrc์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ—ค๋”( -DNETLIB_INDEX_BITS=64 ?)์™€ ํ•จ๊ป˜ ๋ช…์‹œ์ ์œผ๋กœ 32๋น„ํŠธ ์ธ๋ฑ์Šค ๋˜๋Š” 64๋น„ํŠธ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐํ˜ธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ์†”๋ฃจ์…˜์ด ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

lib/libcblas64.so
include/optional_subdir64/cblas.h

๊ทธ๋ฆฌ๊ณ 

lib/libcblas.so
include/optional_subdir/cblas.h

์˜ˆ. ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€์„œ PR์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ NETLIB_INDEX_BITS ์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐํ˜ธ๊ฐ€ ์™„์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด 32๋กœ ์œ ์ง€๋˜๊ณ  -DWeirdNEC -DNETLIB_INDEX_BITS=64 ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜์—๊ฒŒ ์ข‹์€ ์†Œ๋ฆฌ.

๊ทธ๋Ÿฐ ๋‹ค์Œ pkgsrc์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค(๋งˆ๊ฐ ์ž„๋ฐ•) ์ „์— ์ด๋ฅผ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒˆ LAPACK ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ์—ฌ๊ธฐ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ‘ํ•ฉํ•œ ํ›„ ํŒจ์น˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋” ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ผ๋ฐ˜ Makefile ๋นŒ๋“œ๋„ ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ CMake ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ _my_ ํŒจ์น˜์—๋Š” ์•„์ง ์ˆ˜์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธ! ์•„๋งˆ๋„ 2021๋…„ 2ํ•™๊ธฐ์— LAPACK์ด ์ถœ์‹œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„ค, Makefile์€ ๊ทธ์— ๋”ฐ๋ผ ์กฐ์ •๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ €๋Š” ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์†Œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” netlib CBLAS์˜ ํ—ค๋”๊ฐ€ netlib์— ์˜ํ•ด์„œ๋งŒ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. NumPy๋Š” ํ•ญ์ƒ ์ž์ฒด ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/blob/main/numpy/core/src/common/npy_cblas.h

๊ทธ๋ฆฌ๊ณ  ์ด ํ—ค๋”์—์„œ๋Š” ์ธ๋ฑ์Šค ์ง€์ •์— ์‚ฌ์šฉ๋˜๋Š” ์ •์ˆ˜ํ˜•๊ณผ ๋‹ฌ๋ฆฌ CBLAS_INDEX=size_t ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

$ grep CBLAS_INDEX ./numpy/core/src/common/npy_cblas_base.h                                                                                                                                  
CBLAS_INDEX BLASNAME(cblas_isamax)(const BLASINT N, const float  *X, const BLASINT incX);
CBLAS_INDEX BLASNAME(cblas_idamax)(const BLASINT N, const double *X, const BLASINT incX);
CBLAS_INDEX BLASNAME(cblas_icamax)(const BLASINT N, const void   *X, const BLASINT incX);
CBLAS_INDEX BLASNAME(cblas_izamax)(const BLASINT N, const void   *X, const BLASINT incX);

์ฐจ์ด์ :

$ grep cblas_isamax ./numpy/core/src/common/npy_cblas_base.h  /data/pkg/include/cblas.h                                                                                                      
./numpy/core/src/common/npy_cblas_base.h:CBLAS_INDEX BLASNAME(cblas_isamax)(const BLASINT N, const float  *X, const BLASINT incX);
/data/pkg/include/cblas.h:CBLAS_INDEX cblas_isamax(const CBLAS_INDEX N, const float  *X, const CBLAS_INDEX incX);

๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. Netlib์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์œ ํ˜•์ด ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๋ฐ˜๋ฉด ๋‹ค๋ฅธ ๊ตฌํ˜„์—์„œ๋Š” ์ธ๋ฑ์Šค ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฐ’ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. OpenBLAS๋Š” ์˜ˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ isamax๊ฐ€ unsigned size_t๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ C ๋ž˜ํผ๋Š” ์‹ค์ œ๋กœ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Fortran ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(ํŽธ์ง‘: 64์—์„œ ๋ถ€ํ˜ธ ์—†๋Š” 64๋น„ํŠธ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ „๋‹ฌ ์ฐธ์กฐ์— ๋ถ€ํ˜ธ ์žˆ๋Š” 32 ๋˜๋Š” 64๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ์“ฐ๋Š” ์„œ๋ธŒ๋ฃจํ‹ด ๋น„ํŠธ ์‹œ์Šคํ…œ).

์ฐธ์กฐ ๊ตฌํ˜„์— ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? size_t ๊ฐ’์€ ํ•ญ์ƒ isamax()์—์„œ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฐ˜ํ™˜๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๋ฌธ์ œ๋Š” _์ถ”์ธก_์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ€ดํ€ดํ•œ ๋ƒ„์ƒˆ๊ฐ€ ๋‚œ๋‹ค. (ํŽธ์ง‘: size_t๊ฐ€ 32๋น„ํŠธ์ธ 32๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ 64๋น„ํŠธ ์ธ๋ฑ์Šค๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ size_t * ๋ฅผ int * ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ถˆํŽธํ•จ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ตœ์ ํ™”๋œ ๊ตฌํ˜„์ด ๊ฑฐ๊ธฐ์—์„œ size_t๋ฅผ ๊ฒฐ์ •ํ•œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๊ฐ€ ๊ทธ ์‚ฌ์‹ค์„ ๋ฐ›์•„๋“ค์ด๊ณ  ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ numpy๋ฅผ ์ฐธ์กฐ cbla์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ„ํ—˜ํ•œ๊ฐ€์š”?

OpenBLAS๋Š” ์˜ˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (...)
์ตœ์ ํ™”๋œ ๊ตฌํ˜„์ด ๊ฑฐ๊ธฐ์—์„œ size_t๋ฅผ ๊ฒฐ์ •ํ•œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๊ฐ€ ๊ทธ ์‚ฌ์‹ค์„ ๋ฐ›์•„๋“ค์ด๊ณ  ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ํ™•์‹คํžˆ numpy(๋˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด mkl ๋“ฑ)์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ OpenBLAS๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ๊ทœ๋ฒ”์ ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .

ํ™•์‹ ํ•˜๋Š”. OpenBLAS ๋˜๋Š” MKL์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๋‘˜ ๋‹ค ์ •์ฐฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#define CBLAS_INDEX size_t  /* this may vary between platforms */
#ifdef MKL_ILP64
#define MKL_INT MKL_INT64
#else
#define MKL_INT int
#endif
CBLAS_INDEX cblas_isamax(const MKL_INT N, const float  *X, const MKL_INT incX);

๋˜๋Š” ์œ ์‚ฌํ•˜๊ฒŒ

#ifdef OPENBLAS_USE64BITINT
typedef BLASLONG blasint;
#else
typedef int blasint;
#endif
#define CBLAS_INDEX size_t
CBLAS_INDEX cblas_isamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float  *x, OPENBLAS_CONST blasint incx);

๋Œ€ ์ฐธ์กฐ

#ifdef WeirdNEC
   #define CBLAS_INDEX long
#else
   #define CBLAS_INDEX int
#endif
CBLAS_INDEX cblas_isamax(const CBLAS_INDEX N, const float  *X, const CBLAS_INDEX incX);

๊ทธ๋“ค์ด ์—ฌ๊ธฐ ์ฐธ์กฐ์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”? ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ... ์ฐธ์กฐ CBLAS์˜ ์ผ๋ถ€๋„ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” MKL ๋ฐ OpenBLAS๋ฅผ ๋ด…๋‹ˆ๋‹ค.

CBLAS_INDEX cblas_isamin(const MKL_INT N, const float  *X, const MKL_INT incX);
CBLAS_INDEX cblas_idamin(const MKL_INT N, const double *X, const MKL_INT incX);
CBLAS_INDEX cblas_icamin(const MKL_INT N, const void   *X, const MKL_INT incX);
CBLAS_INDEX cblas_izamin(const MKL_INT N, const void   *X, const MKL_INT incX);

CBLAS_INDEX cblas_isamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);

CBLAS_INDEX cblas_ismax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);

CBLAS_INDEX cblas_ismin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void  *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);

๋”ฐ๋ผ์„œ ํ‘œ์ค€์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ํ•œ ๊ฐ€์ง€์ด์ง€๋งŒ size_t vs int ๋Š” 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Netlib ๋ฐฉ์‹์ด ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํฌํŠธ๋ž€ ๋ฃจํ‹ด์€ ๊ฒฐ๊ตญ ์ด์™€ ๊ฐ™์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

c     isamaxsub.f
c
c     The program is a fortran wrapper for isamax.
c     Witten by Keita Teranishi.  2/11/1998
c
      subroutine isamaxsub(n,x,incx,iamax)
c
      external isamax
      integer  isamax,iamax
      integer n,incx
      real x(*)
c
      iamax=isamax(n,x,incx)
      return
      end

... iamax์— ๋Œ€ํ•ด size_t์˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. OpenBLAS ์†Œ์Šค์—์„œ ์ด ์ฐธ์กฐ ๊ตฌํ˜„ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๋Ÿฐ ์™ธ๋ถ€ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ”๋ณด์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์„ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…• ๋ชจ๋‘, ์ฐธ์กฐ BLAS, ์ฐธ์กฐ CBLAS, ์ฐธ์กฐ LAPACK, ์ด ํ”„๋กœ์ ํŠธ์˜ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ถ”์ง„๋ ฅ์€ (1) ์ˆ˜์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ (2) ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜, ์ฐธ์กฐ ๊ตฌํ˜„ ๋ฐ ์ด๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ œํ’ˆ๊ตฐ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ(OpenBLAS, MKL ๋“ฑ)์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง, ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋“ฑ์— ๋Œ€ํ•ด ๋ณด๊ณ  ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐฐ์šธ ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋‹ค๋ฅธ ์ˆ˜์น˜ ์„ ํ˜• ๋Œ€์ˆ˜ํ•™ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์›๋‹ˆ๋‹ค!) ์–ด์จŒ๋“ : ์ฐธ์กฐ BLAS, CBLAS, LAPACK์€ CMake ํŒจํ‚ค์ง•, ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์•ฝ๊ฐ„์˜ ๊ฐœ์„ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ OpenBLAS(์˜ˆ:)์— ๋” ๋‚˜์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ด ๋ชจ๋ธ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด CBLAS๋Š” 1996๋…„๋ถ€ํ„ฐ 2000๋…„๊นŒ์ง€ BLAS๋ฅผ ์žฌ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ์ผํ•œ ์œ„์›ํšŒ(Basic Linear Algebra Subprograms Technical Forum)์—์„œ ํƒ„์ƒํ–ˆ์œผ๋ฉฐ, ์ด ์œ„์›ํšŒ์˜ ์ผ๋ถ€๋กœ BLAS์šฉ C ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค:
http://www.netlib.org/blas/blast-forum/
ํŠนํžˆ ์ฐธ์กฐ:
http://www.netlib.org/blas/blast-forum/cinterface.pdf
์ €๋Š” LAPACK์—์„œ ์ œ๊ณตํ•˜๋Š” CBLAS๊ฐ€ 25๋…„ ์ „ Basic Linear Algebra Subprograms Technical Forum์—์„œ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

CBLAS๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์ด ์žˆ์œผ๋ฉด ํ•จ๊ป˜ ๋ณด๋‚ด์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์–‘ํ•œ ์ดํ•ด ๊ด€๊ณ„์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ด€๋ จ ๋ถ€๋ถ„์€ ํ•ด๋‹น ์‚ฌ์–‘์—์„œ B.2.2์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. BLAS_INDEX ์ผ๋ฐ˜์ ์œผ๋กœ size_t ์ด์ง€๋งŒ ๋‹ค์Œ์— ์‚ฌ์šฉ๋˜๋Š” (์„œ๋ช…๋œ) Fortran ์ •์ˆ˜ ์œ ํ˜•๊ณผ ๋™์ผํ•˜๋„๋ก ์„ ํƒ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ. ๊ทธ๊ฒƒ์€ ๊ตฌํ˜„์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ตœ์ ํ™”๋œ ๊ตฌํ˜„์€ size_t ์„ ํƒํ–ˆ๊ณ  Netlib ์ฐธ์กฐ๋Š” Fortran์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ •์ˆ˜๋ฅผ ์„ ํƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” lib๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ cblas.h์˜ ์‚ฌ๋ณธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#define CBLAS_INDEX size_t  /* this may vary between platforms */

https://github.com/LuaDist/gsl/blob/master/cblas/gsl_cblas.h ์—๋Š” ๋‹ค์Œ์ด ์ˆ˜๋ฐ˜๋ฉ๋‹ˆ๋‹ค.

/* This is a copy of the CBLAS standard header.
 * We carry this around so we do not have to
 * break our model for flexible BLAS functionality.
 */

์ด๊ฒƒ์€ ์ฐธ์กฐ ๊ตฌํ˜„์—์„œ ์‹œ์ž‘๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๊ทธ ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? 41779680d1f233928b67f5f66c0b239aecb42774 ... WeirdNEC์˜ CBLAS_INDEX ์Šค์œ„์น˜๊ฐ€ 64๋น„ํŠธ ๋นŒ๋“œ ์ด์ „์— ์žˆ์—ˆ๋˜ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™€์šฐ, ์ตœ๊ทผ ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค. ์ด์ œ size_t ๊ฐ€ 2015๋…„๊นŒ์ง€ ์ฐธ์กฐ cblas.h์— ์žˆ์—ˆ๊ณ  83fc0b48afd1f9a6d6f8dddb16e69ed7ed0e7242๊ฐ€ ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  WeirdNEC ์ •์˜๋ฅผ ๋„์ž…ํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ์ด๋ ‡๊ฒŒ ์ตœ๊ทผ์ผ์ค„์€ ์ƒ์ƒ๋„ ๋ชปํ–ˆ์–ด์š”! ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด์ „ ๋ฒ„์ „์˜ cblas.h ๊ฐ€ int CBLAS_INDEX ํฌํŠธ๋ž€ ํ˜ธ์ถœ์— ์ „๋‹ฌ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CBLAS_INDEX ๋ฅผ ์ •์ˆ˜ ์œ ํ˜•์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  Fortran ๋ถ€๋ถ„์—์„œ 32๋น„ํŠธ ๋˜๋Š” 64๋น„ํŠธ์šฉ ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ size_t ๋กœ cblas.h์˜ ์ด์ „ ๋ฒ„์ „์„ ์ƒ์†ํ–ˆ์ง€๋งŒ ์ฐธ์กฐ์—์„œ ํ˜„์žฌ CBLAS ์ฝ”๋“œ์™€ ์†Œ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข‹์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? 64๋น„ํŠธ ์‹œ์Šคํ…œ์˜ 32๋น„ํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

#include <stdio.h>
#include <stdlib.h>


void ia_max(int a, void *b)
{
    int *ib = (int*)b;
    *ib = a*2;
}


int main(int argc, char **argv)
{
    int i = atoi(argv[1]);
    size_t maxi;
    ia_max(i, &maxi);
    printf("in %d out %ld\n", i, (long)maxi);
    return 0;
}

๊ทธ ๊ฒฐ๊ณผ

$ gcc -O -o t t.c
$ ./t 42
in 42 out 140724603453524

size_t ๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋„์›€์ด ๋˜์ง€๋งŒ ์•„๋งˆ๋„ ๋ฆฌํ‹€ ์—”๋””์•ˆ์˜ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ด๊ฒƒ ๋•Œ๋ฌธ์— ๊ณค๊ฒฝ์— ๋น ์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ:

  1. ์ฐธ์กฐ CBLAS๋Š” ๋จผ์ € ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ size_t ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋‚˜ Fortran์— ๋Œ€ํ•œ ์‹ค์ œ ํ˜ธ์ถœ์—์„œ๋Š” int๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋‹ค์šด์ŠคํŠธ๋ฆผ(์ตœ์ ํ™”๋œ BLAS, CBLAS ์‚ฌ์šฉ์ž)์€ ์ด์ „ ๋ฒ„์ „์˜ ํ—ค๋”๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. ์ฐธ์กฐ CBLAS๋Š” ํŠน์ • ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ WeirdNEC ํ•ดํ‚น์„ ๋„์ž…ํ•˜์—ฌ size_t๋ฅผ int ๋˜๋Š” long์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค(Fortran ์ธก๊ณผ ์ผ์น˜?!)
  5. 64๋น„ํŠธ ์ฐธ์กฐ CBLAS ์ธํ„ฐํŽ˜์ด์Šค๋Š” Fortran ๊ธฐ๋ณธ ์ •์ˆ˜์— ๋Œ€ํ•ด ๋ชจ๋“  ๊ณณ์—์„œ CBLAS_INDEX ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ์œ„์— ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
  6. ๋‹ค์šด์ŠคํŠธ๋ฆผ์€ 64๋น„ํŠธ ์ง€์›์œผ๋กœ ์ž์ฒด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ํ•ญ์ƒ size_t์ธ CBLAS_INDEX ์—์„œ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  7. ๋‹ค์šด์ŠคํŠธ๋ฆผ์€ CBLAS_INDEX ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์ •์ˆ˜๋ฅผ ์˜ˆ์ƒํ•˜๋Š” Fortran์„ ํ˜ธ์ถœํ•˜๋Š” CBLAS ๋ž˜ํผ๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฉ‹์ง„ ํŒŒ์†์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ํ—ค๋”์™€ ์ฝ”๋“œ๊ฐ€ ๋ถ„๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์•„๋ฌด๋„ ๋ฌธ์ œ๋ฅผ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด isamax์™€ ์นœ๊ตฌ๋ฅผ ์œ„ํ•œ ์ฐธ์กฐ CBLAS ๋ž˜ํผ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ๋†“์ณค์Šต๋‹ˆ๊นŒ?

OpenBLAS๋Š” ์ตœ์†Œํ•œ Reference-LAPACK์˜ CBLAS ๋ž˜ํผ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@martin-frbg ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. cblas_isamax()์— ๋Œ€ํ•œ ์‹ค์ œ ๊ณ„์‚ฐ์— size_t๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” x86-64์— ๋Œ€ํ•œ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠน์ • ์ปค๋„ ๊ตฌํ˜„์„ ์ฐพ์•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ์‹ค์ œ๋กœ (size_t*) ๋ฅผ Fortran ์ธํ„ฐํŽ˜์ด์Šค์— ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

size_t cblas_isamax(โ€ฆ)

์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ int ๋˜๋Š” long(๋˜๋Š” int64_t)์„ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์ œ๊ณตํ•  ๋•Œ. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ 64๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์—์„œ ์ด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์€ CBLAS_INDEX ์˜ ์ผ๊ด€๋œ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ง€๋‚œ 5๋…„ ๋™์•ˆ Netlib์˜ ์˜ˆ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์ฝ”๋“œ๋Š” OpenBLAS/์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด interface/imax.c๋Š” CBLAS๊ฐ€ ์ •์˜๋  โ€‹โ€‹๋•Œ cblas_isamax()๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„์—๋Š” Fortran ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค ๊ตฟ. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” cblas.h ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NumPy(๋ฐ SciPy)์—์„œ cblas_isamax() ๋ฐ ์นœ๊ตฌ์˜ ์‹ค์ œ ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ์ด๋ก ์ ์ธ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ:

  1. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ํฌ๊ธฐ ๋ฐ˜ํ™˜๊ณผ ์ธ๋ฑ์Šค ์ธ์ˆ˜ ๋ชจ๋‘์— ๋Œ€ํ•ด int32_t/int64_t๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Netlib ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  2. Netlib๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋Ÿฌํ•œ ์ˆ˜์ต์— ๋Œ€ํ•ด ๋™๊ตด ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€ size_t ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์ด๊ฑด ๋”ฐ๋กœ ๋…ผ์˜ํ•  ๋ฌธ์ œ์ธ๊ฐ€์š”? ๊ทธ๋Ÿฌ๋‚˜ 32๋น„ํŠธ ๋˜๋Š” 64๋น„ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์‹ : API์˜ ์—ด๊ฑฐํ˜•์ด ์ข‹์€ ์•„์ด๋””์–ด์ธ์ง€(ํ•จ์ˆ˜ ์ธ์ˆ˜ ๋ฐ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ) ์—ฌ์ „ํžˆ ๊ทธ ์•„๋ž˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ •์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์ด ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋ฅผ ๋ถˆ์•ˆํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ƒ๊ฐํ•˜๋ฉด ํ• ์ˆ˜๋ก ์˜ต์…˜ 2: API์— size_t๊ฐ€ ์•„์ฃผ ์˜ค๋žซ๋™์•ˆ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Netlib๋Š” ํ•ด๋‹น size_t๋ฅผ int ๋˜๋Š” long์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. Fortran ์ฝ”๋“œ์™€ ๋” ์ž˜ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ด€๊ณ„์—†์ด size_t๋Š” API๋กœ ์„ค์ •๋˜์—ˆ๊ณ  Netlib ์ฐธ์กฐ๋Š” ์ด๋ฅผ ๊นจ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ PR์„ ์—ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

size_t cblas_isamax(const CBLAS_INDEX N, const float  *X, const CBLAS_INDEX incX);
size_t cblas_idamax(const CBLAS_INDEX N, const double *X, const CBLAS_INDEX incX);
size_t cblas_icamax(const CBLAS_INDEX N, const void   *X, const CBLAS_INDEX incX);
size_t cblas_izamax(const CBLAS_INDEX N, const void   *X, const CBLAS_INDEX incX);

๋‹ค์‹œ? ๊ณผ๊ฑฐ์™€ ๋ฏธ๋ž˜์˜ ๋ชจ๋“  ๊ณณ์—์„œ ํ•ญ์ƒ size_t์ž„์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ด์ƒ ์ด ์œ„์น˜์— ๋งคํฌ๋กœ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/issues/19243์—์„œ ์šฐ๋ฆฌ๋Š” ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ "Netlib๋ฅผ ๋‚˜์‚ฌ๋กœ, size_t๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

size_t ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  C ๋ฐ C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ์ด ๊ฐ’์„ ์ˆ˜๋ฝํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: void* malloc(size_t) , size_t strlen() ๋˜๋Š” std::size_t std::vector<T>::size() (C++)). size_t ํ•˜๋ฉด ๊ฐ’์ด ์ž˜๋ฆฌ๊ณ  ์„œ๋ช…/๋ถ€ํ˜ธ ์—†๋Š” ๋ณ€ํ™˜์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค.
  2. size_t ๋Š” ์ข…์ข… ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ์–‘์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ํ–‰๋ ฌ ์ฐจ์›).
  3. C ๋ฐ C++ ํ‘œ์ค€์€ size_t ์— ๋ชจ๋“  ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  size_t ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค(์ฐธ์กฐ). cppference.com: size_t .

ํŽธ์ง‘: size_t๊ฐ€ 32๋น„ํŠธ์ธ 32๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ 64๋น„ํŠธ ์ธ๋ฑ์Šค๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

32๋น„ํŠธ ์‹œ์Šคํ…œ์—๋Š” 4GB ์ด์ƒ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ(Linux๋Š” ์ด๋ฅผ ์ง€์›ํ•จ) ๋‹จ์ผ 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค๋Š” 4GB ์ด์ƒ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, 64๋น„ํŠธ ์ธ๋ฑ์Šค ์ค‘ ์ƒ์œ„ 32๋น„ํŠธ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

_64๋น„ํŠธ Linux OS์—์„œ ์‹คํ–‰๋˜๋Š” 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ_

๋‚˜๋Š” ๋˜ํ•œ size_t๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ABI ์ค‘๋‹จ์ด์—ˆ๊ณ  Netlib๋ฅผ ๋‚˜๋จธ์ง€ ์„ธ๊ณ„์™€ ๋™๊ธฐํ™”ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์— ๋Œ€ํ•ด ๋ƒ‰์ •ํ•˜๊ฒŒ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.-)

1. All of the C and C++ standard library functions accept and return this value

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ์„ ๋•Œ, ๋‚˜๋Š” C++ ์ปจํ…Œ์ด๋„ˆ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์„œ๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ญ์‚ฌ์ ์ธ ์˜ค๋ฅ˜๋ผ๋Š” ์‚ฌ์‹ค์„ ์šฐ์—ฐํžˆ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์•„๋งˆ๋„ size() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•๊นŒ์ง€๋„ ๋น ๋ฅด๊ฒŒ ์„œ๋ช…๋œ ์ˆซ์ž์™€ ์„œ๋ช…๋˜์ง€ ์•Š์€ ์ˆซ์ž๋ฅผ ํ˜ผํ•ฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ. Netlib์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ํฌ๊ธฐ์™€ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ํ•ญ์ƒ ์„œ๋ช…๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด์ ์œผ๋กœ ์ผ๊ด€์„ฑ์ด ์žˆ์ง€๋งŒ ๋ฌผ๋ก  malloc() ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 32๋น„ํŠธ(๋˜๋Š” ์ด๋ก ์ƒ 64๋น„ํŠธ).

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ ๊ฒฐ๊ตญ ์ธ๋ฑ์Šค๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์˜คํ”„์…‹์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ถ€ํ˜ธ๊ฐ€ ์—†๊ณ  ์˜คํ”„์…‹์€ ๋ถ€ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. -unsigned_value ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ(MSVC)๊ฐ€ ํ˜ผ๋™๋˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณ€ํ™˜ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฑฑ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  malloc()๊ณผ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋„˜๊ฒจ์ค„ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด size_t๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ์ด๋ฉฐ ์ด์ „์— CBLAS์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋นŒ๋“œ์—์„œ ๊ณต๊ธ‰์—…์ฒด cblas.h ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

32๋น„ํŠธ ์‹œ์Šคํ…œ์—๋Š” 4GB ์ด์ƒ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ(Linux๋Š” ์ด๋ฅผ ์ง€์›ํ•จ) ๋‹จ์ผ 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค๋Š” 4GB ์ด์ƒ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, 64๋น„ํŠธ ์ธ๋ฑ์Šค ์ค‘ ์ƒ์œ„ 32๋น„ํŠธ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. size_t ๋Š” 32๋น„ํŠธ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด (๋ฐ”๋ณด๊ฐ€ ๋  ์ˆ˜๋กœ) ๊ฑด์„คํ•˜๋ฉด cblas_isamax() ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋นŒ๋“œ๋ฅผ ํ•ดํ‚น ํ•œ ํ›„, 64 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ long ์žˆ์ง€๋งŒ int64_t ๊ณผ์ •์„, ์–ด๋–ค ๊ฒƒ, ๊ทธ๋Ÿฐ ์‚ฌ์šฉ์—์„œ ์ •๋ง ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

size_t cblas_isamax(); // really int64_t cblas_isamax()!
size_t value = cblas_isamax(โ€ฆ);

x86 ํ˜ธ์ถœ ๊ทœ์น™์€ 64๋น„ํŠธ ๊ฐ’์„ EAX ๋ฐ EDX์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜ ๋ฐ ์ผ๋ถ€ ๋ฒ„ํผ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋”ฐ๋ผ์„œ ์†์ƒ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ๋Š” ์ƒ์œ„ 32๋น„ํŠธ๊ฐ€ ๋ฌด์‹œ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋น… ์—”๋””์•ˆ 32๋น„ํŠธ ์‹œ์Šคํ…œ(ARM์˜ ์ผ๋ถ€ ํ˜•์‹)์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์›ํ•˜๋Š” ๊ฐ’์˜ ์ ˆ๋ฐ˜์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

32๋น„ํŠธ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” 64๋น„ํŠธ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ๋น„ํฌ์†Œ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _at_least_๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ฑด๊ฐ•์— ํ•ด๋กœ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

x86 Linux(x86-64 ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ gcc -m32 ์—์„œ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์œ„ 32๋น„ํŠธ๋งŒ ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋” ํฅ๋ฏธ๋กœ์šด ๊ฒฝ์šฐ ... 64๋น„ํŠธ size_t:

size_t cblas_isamax(); // really int32_t cblas_isamax()!
size_t value = cblas_isamax(โ€ฆ);

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, x86-64์—์„œ 64๋น„ํŠธ RAX์™€ 32๋น„ํŠธ EAX ์‚ฌ์ด์˜ ๋…ํŠนํ•œ ๊ด€๊ณ„๋Š” ๊ณต์œ  ๋ ˆ์ง€์Šคํ„ฐ์—์„œ 32๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ƒ์œ„ 32๋น„ํŠธ๋ฅผ ์กฐ์šฉํžˆ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์†Œ ์ž˜ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„ ์ด์ƒํ•œ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

$ cat ret32.c 
#include <stdint.h>

int32_t ret64(int64_t a)
{
    a += 1LL<<32;
    return a;
}
$ gcc -m64  -g -c -o ret32.o ret32.c 
$ LANG=C objdump -S ret32.o 
[โ€ฆ]
   8:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
    a += 1LL<<32;
   c:   48 b8 00 00 00 00 01    movabs $0x100000000,%rax
  13:   00 00 00 
  16:   48 01 45 f8             add    %rax,-0x8(%rbp)
    return a;
  1a:   48 8b 45 f8             mov    -0x8(%rbp),%rax

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ฒด 64๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•˜๊ณ  32๋น„ํŠธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ƒ์œ„ 32๋น„ํŠธ๋ฅผ ์ง€์šฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ์ง€ ๋…ผ์Ÿํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜ธ์ถœ์ž์—๊ฒŒ๋งŒ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ 32๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ cat call.c 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

INDEX ret64(int64_t);

int main(int argc, char **argv)
{
    if(argc < 2)
        return 1;
    int64_t a = (int64_t)strtoll(argv[1], NULL, 10);
    INDEX  s = ret64(a);
    printf("%lld\n", (long long)s);
    return 0;
}
$ gcc -m64 -g -DINDEX=int32_t -c -o call32_64.o call.c
$ gcc -m64 -g -DINDEX=size_t -c -o call64_64.o call.c
$ ./call32_64 1
1
$ ./call64_64 1
4294967297

์žฌ๋ฏธ์žˆ๋Š”. 32๋น„ํŠธ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ ์ œ๊ณตํ•˜๋Š” 32๋น„ํŠธ ๋ฐ˜ํ™˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ (์›์น™์ ์œผ๋กœ) Netlib CBLAS์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ size_t๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. RAX์˜ ์ƒ์œ„ 32๋น„ํŠธ๋Š” ์‹ค์ œ๋กœ ์‹ค์ œ ์ฝ”๋“œ์—์„œ 0์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ... ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ํ•˜์œ„ 32๋น„ํŠธ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค... ๊ฑฐ๊ธฐ์— ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ... Netlib๋ฅผ ๋‹ค์‹œ size_t๋กœ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ?

์ด ๋ชจ๋“  ๊ท€์ค‘ํ•œ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด @langou์™€ ์•ฝ๊ฐ„ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ œ ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ PR์—์„œ:

  1. CBLAS_INDEX์™€ CBLAS_INT๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” cblas.h ๋กœ ๋‹ค์‹œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด MKL(CBLAS_INDEX ๋ฐ MKL_INT) ๋ฐ OpenBLAS(CBLAS_INDEX ๋ฐ blasint)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. CBLAS_INDEX๋Š” i*amax ์˜ ๋ฐ˜ํ™˜์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ BLAS์™€ ํ˜ธํ™˜๋˜๋Š” ABI๋ฅผ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋˜ํ•œ CBLAS_INDEX์˜ ๊ธฐ๋ณธ๊ฐ’์„ size_t ํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์˜๊ฒฌ์„ ์ˆ˜๋ ดํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด ์Šค๋ ˆ๋“œ์˜ ์ตœ๊ทผ ๋…ผ์˜ ์ด๋ฉด์— ์žˆ๋Š” (๋˜๋Š” ์•„๋งˆ๋„ ๊ฐ™์€) ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
@drhpc๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด,
https://github.com/Reference-LAPACK/lapack/commit/83fc0b48afd1f9a6d6f8dddb16e69ed7ed0e7242 ๊ฐ€ CBLAS_INDEX์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฉฐ,
https://github.com/Reference-LAPACK/lapack/commit/41779680d1f233928b67f5f66c0b239aecb42774 ์—์„œ CBLAS_INDEX์˜ ์‚ฌ์šฉ์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด:

  • OpenBLAS, MKL, GNU Scientific Library ๋ฐ Numpy๋Š” ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ size_t ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • BLAS์šฉ C ์ธํ„ฐํŽ˜์ด์Šค(https://www.netlib.org/blas/blast-forum/cinterface.pdf)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CBLAS_INDEX = size_t ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด PR์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” @drhpc ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ 

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PR์„ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.

@mgates3 ์€ Slate Google ๊ทธ๋ฃน์— ๋Œ€ํ•œ ํ† ๋ก ์„ ๋‚˜์—๊ฒŒ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://groups.google.com/a/icl.utk.edu/g/slate-user/c/f5y6gt0aoLs/m/oQyyhikwCgAJ
๋…ผ์˜๋Š” "CBLAS_INDEX"๊ฐ€ ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ "CBLAS_INT"๊ฐ€ ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CBLAS_INT๋Š” size_t ๋˜๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ๋“ฑ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ฐธ๊ฐ€์ž๋ถ„๋“ค์ด ์ข‹์€ ์ง€์ ์„ ํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ํŒจ์Šคํ•ฉ๋‹ˆ๋‹ค.

#588์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งž์Šต๋‹ˆ๋‹ค. size_t ๋Š” 32๋น„ํŠธ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด (๋ฐ”๋ณด๊ฐ€ ๋  ์ˆ˜๋กœ) ๊ฑด์„คํ•˜๋ฉด cblas_isamax() ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋นŒ๋“œ๋ฅผ ํ•ดํ‚น ํ•œ ํ›„, 64 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ long ์žˆ์ง€๋งŒ int64_t ๊ณผ์ •์„, ์–ด๋–ค ๊ฒƒ, ์ •๋ง ๊ทธ๋Ÿฐ ์‚ฌ์šฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

size_t cblas_isamax(); // really int64_t cblas_isamax()!
size_t value = cblas_isamax(โ€ฆ);

x86 ํ˜ธ์ถœ ๊ทœ์น™์€ 64๋น„ํŠธ ๊ฐ’์„ EAX ๋ฐ EDX์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜ ๋ฐ ์ผ๋ถ€ ๋ฒ„ํผ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋”ฐ๋ผ์„œ ์†์ƒ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ๋Š” ์ƒ์œ„ 32๋น„ํŠธ๊ฐ€ ๋ฌด์‹œ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋น… ์—”๋””์•ˆ 32๋น„ํŠธ ์‹œ์Šคํ…œ(ARM์˜ ์ผ๋ถ€ ํ˜•์‹)์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์›ํ•˜๋Š” ๊ฐ’์˜ ์ ˆ๋ฐ˜์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๊ฒŒ์ž„ ์˜ค๋ฒ„์ž…๋‹ˆ๋‹ค. 32 ๋น„ํŠธ ํŒ”์˜ CPU์—์„œ ๋„ค ๊ฐœ์˜ 32 ๋น„ํŠธ ๊ฐ’์ด ์ „๋‹ฌ ๋  ์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ˜ํ™˜, 64 ๋น„ํŠธ์˜ ๊ฐ’์€ ๋‘ ๊ฐœ์˜ ์—ฐ์† ๋œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฐจ์ง€ ์„น์…˜ 6.1.1.1๋ฅผ ์ฐธ์กฐ ์ง€์ง€๋Œ€ Architecture_์— ๋Œ€ํ•œ _Procedure ํ˜ธ์ถœ ํ‘œ์ค€ . ํ•˜๋‚˜์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์“ฐ๋Š” ๋Œ€์‹  ํ˜ธ์ถœ ์ˆ˜์‹ ์ž๋Š” 64๋น„ํŠธ ์ •์ˆ˜๋กœ ๋‘ ๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ์ฆ‰์‹œ ์Šคํƒ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ ์ •๋ ฌ์€ 32๋น„ํŠธ์ด์ง€๋งŒ 32๋น„ํŠธ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋Œ€์‹  ์ˆ˜์‹ ์ž๊ฐ€ 64๋น„ํŠธ๋ฅผ ์”๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๊ฒŒ์ž„์ด ๋๋‚ฌ๊ณ  ์ด ๋ฌธ์ œ(์Šคํƒ ์ฝ๊ธฐ/์“ฐ๊ธฐ ํฌ๊ธฐ์˜ ๋ถˆ์ผ์น˜)๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ๋ชจ๋“  ๋ช…๋ น์–ด ์„ธํŠธ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ ๊ฒฐ๊ตญ ์ธ๋ฑ์Šค๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์˜คํ”„์…‹์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ถ€ํ˜ธ๊ฐ€ ์—†๊ณ  ์˜คํ”„์…‹์€ ๋ถ€ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ(MSVC)๊ฐ€ -unsigned_value๋กœ ํ˜ผ๋™๋˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณ€ํ™˜ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฑฑ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, C ๋ฐ C++ ๋’ค์— ์žˆ๋Š” ํ‘œ์ค€ ์œ„์›ํšŒ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋ช…๋ฐฑํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. u ๊ฐ€ ๋ถ€ํ˜ธ ์—†๋Š” ๊ฐ’์ด๊ณ  s ๊ฐ€ ๋ถ€ํ˜ธ ์žˆ๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ u s ๋งŒํผ์˜ ๋น„ํŠธ๊ฐ€ ์žˆ์œผ๋ฉด u + s ์˜ค๋ฒ„ํ”Œ๋กœ ๋˜๋Š” ์–ธ๋”ํ”Œ๋กœ๊ฐ€ ์•„๋‹Œ ํ•œ u + s ๋Š” ์ˆ˜ํ•™์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค. ์–ธ๋”/์˜ค๋ฒ„ํ”Œ๋กœ์ธ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” (u + s) mod 2^b ์™€ ๊ฐ™์ด ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ b ๋Š” u ๋ฐ s ์˜ ๋น„ํŠธ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ๋ถ€ํ˜ธ ์žˆ๋Š” ์œ ํ˜•์ด ๋ถ€ํ˜ธ ์—†๋Š” ์œ ํ˜•์˜ ๋ชจ๋“  ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ€ํ˜ธ ์—†๋Š” ๊ฐ’์€ ๋ถ€ํ˜ธ ์—†๋Š” ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

C11 ํ‘œ์ค€ ์ดˆ์•ˆ ์˜ ๊ด€๋ จ ์กฐํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • 6.2.5.9: ๋ถ€ํ˜ธ ์—†๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋งŒ ์žˆ๋Š” ์ด์ง„ ์—ฐ์‚ฐ์€ ์˜ค๋ฒ„ํ”Œ๋กœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“ˆ๋กœ MAX + 1 , ์—ฌ๊ธฐ์„œ MAX ๋Š” ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • 6.3.1.3๋Š” : ์„œ๋ช… ๋œ ๊ฐ’์„ ๊ฐ์•ˆํ•  ๋•Œ s , ๊ทธ๊ฒƒ์ด ๋ถ€ํ˜ธ์—†๋Š” ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค์—๊ฒŒ s ๊ฒฝ์šฐ s >= 0 , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค s + MAX + 1 .
  • 6.3.1.8: [๋™์ผํ•œ ํฌ๊ธฐ์˜] ๋ถ€ํ˜ธ ์žˆ๋Š” ํ”ผ์—ฐ์‚ฐ์ž์™€ ๋ถ€ํ˜ธ ์—†๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ถ€ํ˜ธ ์—†๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ถ€ํ˜ธ ์žˆ๋Š” ์œ ํ˜•์ด ๋ถ€ํ˜ธ ์—†๋Š” ์œ ํ˜•์˜ ๋ชจ๋“  ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ€ํ˜ธ ์—†๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ถ€ํ˜ธ ์žˆ๋Š” ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ u + s (C ๊ตฌ๋ฌธ)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

  • (u + s) mod (M + 1) ๊ฒฝ์šฐ s >= 0 ,
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด (u + s + M + 1) mod (M + 1) ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฒ„ํ”Œ๋กœ ๋˜๋Š” ์–ธ๋”ํ”Œ๋กœ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ด ํ‘œํ˜„์‹์€ ์ง๊ด€์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์ธ u + s ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ์„ ๋•Œ, ๋‚˜๋Š” C++ ์ปจํ…Œ์ด๋„ˆ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์„œ๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ญ์‚ฌ์ ์ธ ์˜ค๋ฅ˜๋ผ๋Š” ์‚ฌ์‹ค์„ ์šฐ์—ฐํžˆ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์•„๋งˆ๋„ size() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•๊นŒ์ง€๋„ ๋น ๋ฅด๊ฒŒ ์„œ๋ช…๋œ ์ˆซ์ž์™€ ์„œ๋ช…๋˜์ง€ ์•Š์€ ์ˆซ์ž๋ฅผ ํ˜ผํ•ฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ.

๋ชจ๋“  ๊ณณ์—์„œ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ์ผ๋ถ€ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ(C++์˜ ๋ฐœ๋ช…๊ฐ€ ํฌํ•จ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. C++ ํ•ต์‹ฌ ์ง€์นจ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์Šน์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ชจ๋“  ๊ณณ์—์„œ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜" ์ •์ฑ…์˜ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ตœ์†Œ๊ฐ’ ํ™•์ธ: ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์˜ ๊ฒฝ์šฐ ๋งŽ์€ ๊ฒฝ์šฐ ์ตœ์†Œ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํ•„์š”ํ•˜๊ณ  ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜์˜ ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: CWE-839 _์ตœ์†Œ ๊ฒ€์‚ฌ ์—†๋Š” ์ˆซ์ž ๋ฒ”์œ„ ๋น„๊ต_ ์ฐธ์กฐ) .
  • ์˜ค๋ฒ„ํ”Œ๋กœ: ๋ถ€ํ˜ธ ์—†๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ์ •์˜๋œ ๋ฐ˜๋ฉด ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

a + b < a ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋œ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฝ๊ณ  ์—†์ด ์ด๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GCC bug 30475 _assert(int+100 > int) optimized away_ from 2007. ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค( a unsigned, b ๊ฐ€๋Šฅ ๋ถ€ํ˜ธ ๋ฐ b ์ตœ๋Œ€ a ). 2020๋…„์˜ _OptOut โ€“ ์ปดํŒŒ์ผ๋Ÿฌ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ ์ตœ์ ํ™”_ ๊ธฐ์‚ฌ๋ฅผ ๋ณด๋ฉด GCC ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

5tefan picture 5tefan  ยท  3์ฝ”๋ฉ˜ํŠธ

hokb picture hokb  ยท  16์ฝ”๋ฉ˜ํŠธ

Dichloromethane picture Dichloromethane  ยท  11์ฝ”๋ฉ˜ํŠธ

weslleyspereira picture weslleyspereira  ยท  5์ฝ”๋ฉ˜ํŠธ

miroi picture miroi  ยท  10์ฝ”๋ฉ˜ํŠธ