ํ์ฌ ๋ฐ๋น์์๋ 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:
๊ฐ์ฌ ํด์,
์์ด์ค
์๋ Aisha, ๊ทธ๊ฒ์ ๋์๊ฒ ์์ ํ ์ดํด๋์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค๋ก๋ถํฐ ํผ๋๋ฐฑ์ด ์๋์ง ๋ด ์๋ค. ๊ทธ๋ฌ๋ ๋ฉฐ์น ๋ง ๊ธฐ๋ค๋ฆฌ์. ์ ์ด
ํ์คํ, ๊ทธ๊ฒ์ ์ข์ ๊ณํ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ธ์์ @langou
๋น์ ์ ๋๋ฌด ๋น ๋ฆ
๋๋ค : ์ฌ์ฅ :
์์ ์ฑ์ ์ํด, ๋๋ ์ฐ๋ฆฌ๊ฐ ์์ง ํด์ผ ํ ์ผ๋ค์ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค:
์ฒซ ๋ฒ์งธ ์์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์์ ํ์ํฉ๋๋ค. ๋ถํํ๋ "๊นจ๋ํ" ์๋ฃจ์ ์ด ์์ต๋๋ค.
ํ์ผ ์ด๋ฆ ์ง์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ์ง๋ฌธ
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
ํ์ผ์ด ์ ์ ํ ํค๋๋ฅผ ํฌํจํ๊ธฐ ์ํด ์ฝ๊ฐ์ ์กฐ์ ์ด ํ์ํ์ง๋ง ์ด๊ฒ์ ๋น๋ ์๊ฐ ๋์์๋ง ํด๋นํ๋ฏ๋ก ํดํน๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.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์ผ๋ก ์ด๊ธฐํํ๋ฉด ๋์์ด ๋์ง๋ง ์๋ง๋ ๋ฆฌํ ์๋์์ ๊ฒฝ์ฐ์๋ง ํด๋น๋ ๊ฒ์
๋๋ค. ์๋ฌด๋ ์ด๊ฒ ๋๋ฌธ์ ๊ณค๊ฒฝ์ ๋น ์ง์ง ์์ต๋๊น? ๋๋ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ด์ผํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก:
size_t
๋ฅผ ๊ฐ์ก์ต๋๋ค.CBLAS_INDEX
์ฌ์ฉํ์ฌ ๊ทธ ์์ ๋น๋๋ฉ๋๋ค.CBLAS_INDEX
์์ ๋ถ๋ฆฌํ์ต๋๋ค.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()
๋ฐ ์น๊ตฌ์ ์ค์ ์ฌ์ฉ๋ฒ์ ์ฐพ์ง ๋ชปํ๋ฏ๋ก ์ด๊ฒ์ ์ด๋ก ์ ์ธ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์์ ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋์:
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
๋ฅผ ์ฌ์ฉํ๋ ์ธ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
void* malloc(size_t)
, size_t strlen()
๋๋ std::size_t std::vector<T>::size()
(C++)). size_t
ํ๋ฉด ๊ฐ์ด ์๋ฆฌ๊ณ ์๋ช
/๋ถํธ ์๋ ๋ณํ์ด ๋ฐฉ์ง๋ฉ๋๋ค.size_t
๋ ์ข
์ข
์์๊ฐ ๋ ์ ์๋ ์์ ํํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค(์: ํ๋ ฌ ์ฐจ์).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์์:
cblas.h
๋ก ๋ค์ ์ด๋ํฉ๋๋ค. ์ด๊ฒ์ด MKL(CBLAS_INDEX ๋ฐ MKL_INT) ๋ฐ OpenBLAS(CBLAS_INDEX ๋ฐ blasint)์์ ๋ฐ์ํฉ๋๋ค. CBLAS_INDEX๋ i*amax
์ ๋ฐํ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ BLAS์ ํธํ๋๋ ABI๋ฅผ ๋ณต์ํฉ๋๋ค.size_t
ํ๊ณ ์ปค๋ฎค๋ํฐ์์ ์๊ฒฌ์ ์๋ ดํฉ๋๋ค.๋๋ ์ด๊ฒ์ด ์ด ์ค๋ ๋์ ์ต๊ทผ ๋
ผ์ ์ด๋ฉด์ ์๋ (๋๋ ์๋ง๋ ๊ฐ์) ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@drhpc๊ฐ ์ง์ ํ๋ฏ์ด,
https://github.com/Reference-LAPACK/lapack/commit/83fc0b48afd1f9a6d6f8dddb16e69ed7ed0e7242 ๊ฐ CBLAS_INDEX์ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ์ผ๋ฉฐ,
https://github.com/Reference-LAPACK/lapack/commit/41779680d1f233928b67f5f66c0b239aecb42774 ์์ CBLAS_INDEX์ ์ฌ์ฉ์ ๋ณ๊ฒฝํ์ต๋๋ค.
๊ฐํํ๊ธฐ ์ํด:
size_t
๋ฅผ ์ฌ์ฉํฉ๋๋ค.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 ํ์ค ์ด์ ์ ๊ด๋ จ ์กฐํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
MAX + 1
, ์ฌ๊ธฐ์ MAX
๋ ํํ ๊ฐ๋ฅํ ๊ฐ์ฅ ํฐ ๊ฐ์
๋๋ค.s
, ๊ทธ๊ฒ์ด ๋ถํธ์๋ ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค์๊ฒ s
๊ฒฝ์ฐ s >= 0
, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ณํ๋ฉ๋๋ค s + MAX + 1
.๋ฐ๋ผ์ u + s
(C ๊ตฌ๋ฌธ)์ ๋ค์๊ณผ ๊ฐ์ด ํ๊ฐ๋ฉ๋๋ค.
(u + s) mod (M + 1)
๊ฒฝ์ฐ s >= 0
,(u + s + M + 1) mod (M + 1)
์
๋๋ค.์ค๋ฒํ๋ก ๋๋ ์ธ๋ํ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ํํ์์ ์ง๊ด์ ์ผ๋ก ์ํ๋ ๊ฒฐ๊ณผ์ธ u + s
ํ๊ฐ๋ฉ๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ์กฐ์ฌํ์ ๋, ๋๋ C++ ์ปจํ ์ด๋ ์ธ๋ฑ์ค์ ๋ํด ์๋ช ๋์ง ์์ ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ญ์ฌ์ ์ธ ์ค๋ฅ๋ผ๋ ์ฌ์ค์ ์ฐ์ฐํ ์๊ฒ ๋์๊ณ , ์๋ง๋ size() ๋ฉ์๋์ ๋ฐํ ์ ํ๊น์ง๋ ๋น ๋ฅด๊ฒ ์๋ช ๋ ์ซ์์ ์๋ช ๋์ง ์์ ์ซ์๋ฅผ ํผํฉํ๊ฒ ๋๋ฏ๋ก ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก.
๋ชจ๋ ๊ณณ์์ ๋ถํธ ์๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์ ์ํ๋ ์ผ๋ถ C++ ํ๋ก๊ทธ๋๋จธ(C++์ ๋ฐ๋ช ๊ฐ ํฌํจ)๊ฐ ์์ต๋๋ค. C++ ํต์ฌ ์ง์นจ์ ์ฐธ์กฐํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ ์น์ธ์ด๋ผ๊ณ ๋ถ๋ฅด์ง ์์ ๊ฒ์ ๋๋ค. "๋ชจ๋ ๊ณณ์์ ๋ถํธ ์๋ ์ ์" ์ ์ฑ ์ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
a + b < a
ํํ์์ ์ฌ์ฉํ์ฌ ์๋ช
๋ ์ค๋ฒํ๋ก๋ฅผ ํ์ธํ๋ ค๊ณ ์๋ํ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๋ ๊ฒฝ๊ณ ์์ด ์ด๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด GCC bug 30475 _assert(int+100 > int) optimized away_ from 2007. ์ด ์๋ํฉ๋๋ค. ํ์ง๋ง ๋ถํธ ์๋ ์ ์๋ฅผ ์ฌ์ฉํฉ๋๋ค( a
unsigned, b
๊ฐ๋ฅ ๋ถํธ ๋ฐ b
์ต๋ a
). 2020๋
์ _OptOut โ ์ปดํ์ผ๋ฌ ์ ์๋์ง ์์ ๋์ ์ต์ ํ_ ๊ธฐ์ฌ๋ฅผ ๋ณด๋ฉด GCC ๋์์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.