[ BLAS ] use openblas function to set num threads accepted/tizen/unified/20220419.142304 submit/tizen/20220418.053521 submit/tizen/20220418.061930
authorjijoong.moon <jijoong.moon@samsung.com>
Thu, 14 Apr 2022 11:58:01 +0000 (20:58 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Fri, 15 Apr 2022 05:01:02 +0000 (14:01 +0900)
This patch use openblas_set_num_thread() to set the number of thread
for BLAS computation, instread of set environment variables

**Self evaluation:**
1. Build test:  [X]Passed [ ]Failed [ ]Skipped
2. Run test:  [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: jijoong.moon <jijoong.moon@samsung.com>
jni/prepare_openblas.sh
meson.build
meson_options.txt
nntrainer/tensor/blas_interface.cpp
tools/package_android.sh

index 8845c8e..014d1d6 100755 (executable)
@@ -13,6 +13,7 @@
 set -e
 TARGET=$1
 TAR_PREFIX=openblas
+
 TAR_NAME=${TAR_PREFIX}-0.2.20.tar.gz
 URL="https://github.com/nnstreamer/nnstreamer-android-resource/raw/master/external/${TAR_NAME}"
 
index c50b877..c8dc3c3 100644 (file)
@@ -130,8 +130,6 @@ else
   nntrainer_conf.set('CAPI_ML_COMMON_DEP', '')
   extra_defines += '-DML_API_COMMON=0'
 endif
-
-
 blas_dep = dummy_dep
 # Dependencies
 if get_option('enable-cublas')
@@ -140,18 +138,20 @@ endif
 
 if get_option('enable-blas')
   extra_defines += '-DUSE_BLAS=1'
-  if get_option('platform') == 'tizen' or get_option('platform') == 'yocto'
-    blas_dep = dependency('openblas')
-  elif get_option('platform') == 'android'
+
+  if get_option('platform') == 'android'
     message('preparing blas')
     run_command(meson.source_root() / 'jni' / 'prepare_openblas.sh', meson.build_root(), check: true)
     blas_dep = found_dummy_dep
     blas_root = meson.build_root() / 'openblas'
   else
-    blas_dep = dependency('blas-openblas', required:false)
-    # for Ubuntu 20.04
-    if not blas_dep.found()
-      blas_dep = dependency('openblas')
+    blas_dep = dependency('openblas')
+  endif
+
+  if blas_dep.found()
+    if get_option('openblas-num-threads') > 0
+      extra_defines += '-DBLAS_NUM_THREADS=@0@'.format(get_option('openblas-num-threads'))
+      message('set openblas num threads=@0@'.format(get_option('openblas-num-threads')))
     endif
   endif
 endif
index 058e417..7a55290 100644 (file)
@@ -20,6 +20,7 @@ option('capi-ml-common-actual', type: 'string', value: 'capi-ml-common',
         description: 'backward compatible dependency name of capi-ml-common. ignored if ml-api-support is disabled.')
 option('tizen-version-major', type: 'integer', min : 4, max : 9999, value: 9999) # 9999 means "not Tizen"
 option('tizen-version-minor', type: 'integer', min : 0, max : 9999, value: 0)
+option('openblas-num-threads', type: 'integer', min : 0, max : 9999, value: 0)
 
 # test related option
 option('reduce-tolerance', type: 'boolean', value: true)
index 5087dbe..3c7beba 100644 (file)
@@ -140,6 +140,9 @@ static unsigned int isamax_raw(const unsigned int N, const float *X,
 void saxpy(const unsigned int N, const float alpha, const float *X,
            const int incX, float *Y, const int incY) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   cblas_saxpy(N, alpha, X, incX, Y, incY);
 #else
   saxpy_raw(N, alpha, X, incX, Y, incY);
@@ -179,6 +182,9 @@ void sgemm(CBLAS_ORDER order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
   cudaMemcpy(C, d_C, size_C, cudaMemcpyDeviceToHost);
   cublasDestroy(handle);
 #elif defined USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   cblas_sgemm(order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C,
               ldc);
 #else
@@ -190,6 +196,9 @@ void sgemm(CBLAS_ORDER order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
 void scopy(const unsigned int N, const float *X, const int incX, float *Y,
            const int incY) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   cblas_scopy(N, X, incX, Y, incY);
 #else
   scopy_raw(N, X, incX, Y, incY);
@@ -198,6 +207,9 @@ void scopy(const unsigned int N, const float *X, const int incX, float *Y,
 
 void sscal(const int N, const float alpha, float *X, const int incX) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   cblas_sscal(N, alpha, X, incX);
 #else
   sscal_raw(N, alpha, X, incX);
@@ -206,6 +218,9 @@ void sscal(const int N, const float alpha, float *X, const int incX) {
 
 float snrm2(const int N, const float *X, const int incX) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   return cblas_snrm2(N, X, incX);
 #else
   return snrm2_raw(N, X, incX);
@@ -215,6 +230,9 @@ float snrm2(const int N, const float *X, const int incX) {
 float sdot(const unsigned int N, const float *X, const unsigned int incX,
            const float *Y, const unsigned int incY) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   return cblas_sdot(N, X, incX, Y, incY);
 #else
   return sdot_raw(N, X, incX, Y, incY);
@@ -226,6 +244,9 @@ void sgemv(CBLAS_ORDER order, CBLAS_TRANSPOSE TransA, const unsigned int M,
            const unsigned int lda, const float *X, const int incX,
            const float beta, float *Y, const int incY) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   return cblas_sgemv(order, TransA, M, N, alpha, A, lda, X, incX, beta, Y,
                      incY);
 #else
@@ -235,6 +256,9 @@ void sgemv(CBLAS_ORDER order, CBLAS_TRANSPOSE TransA, const unsigned int M,
 
 unsigned int isamax(const unsigned int N, const float *X, const int incX) {
 #ifdef USE_BLAS
+#ifdef BLAS_NUM_THREADS
+  openblas_set_num_threads(BLAS_NUM_THREADS);
+#endif
   return cblas_isamax(N, X, incX);
 #else
   return isamax_raw(N, X, incX);
index 9d2dbc4..5928d63 100755 (executable)
@@ -14,11 +14,13 @@ fi
 pushd $TARGET
 
 if [ ! -d builddir ]; then
-  meson builddir -Dplatform=android
+  #defualt value of openblas num threads is 1 for android
+  meson builddir -Dplatform=android -Dopenblas-num-threads=1
 else
   echo "warning: $TARGET/builddir has already been taken, this script tries to reconfigure and try building"
   pushd builddir
-    meson configure -Dplatform=android
+    #defualt value of openblas num threads is 1 for android
+    meson configure -Dplatform=android -Dopenblas-num-threads=1
     meson --wipe
   popd
 fi