Apple Silicon M1 Max(macOS14.3.1)下OpenMP与OpenBLAS协同配置问题
Apple Silicon M1 Max + macOS Sonoma 14.3.1 下 OpenMP 与 OpenBLAS 协同多线程失效问题
在Apple Silicon M1 Max、macOS Sonoma 14.3.1环境中,尝试让OpenMP与OpenBLAS协同工作,期望在OpenMP并行区域内运行BLAS操作以获得多线程性能提升,但始终未成功——无论如何配置环境变量,Instruments等分析工具均显示代码未真正启用多线程,也未观察到显著的性能提升。已查阅Stack Overflow相关问答、OpenBLAS官方手册及FAQ等资料,但问题仍未解决。
测试代码如下:
#include <cblas.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> #include <time.h> #ifdef _OPENMP #include <omp.h> #endif #ifndef VAL_N #define VAL_N 2400 #endif #ifndef VAL_M #define VAL_M 24 #endif #ifndef VAL_LDA #define VAL_LDA 2401 #endif // Initialize random array void random_number(double* array, int size) { for (int i = 0; i < size; i++) { // Generate number in [0, 1[ double r = (double)rand() / (double)(RAND_MAX - 1); array[i] = r; } } int main() { const int n = VAL_N, m = VAL_M, lda = VAL_LDA, ldb = lda, ldx = lda; double a[n][lda]; // column-major order (Fortran) double b[m][ldb]; double x[m][ldx]; double pr[n]; double norme; int nb_iter_min, nb_iter_max; #ifdef _OPENMP int num_threads; #pragma omp parallel { num_threads = omp_get_num_threads(); } printf("\nMutli-threaded mode on with %d thread(s).\n\n", num_threads); #endif // Initialize matrix and right-hand side random_number(&a[0][0], n * lda); random_number(&b[0][0], m * ldb); // Muscle up the diagonal for (int i = 0; i < n; i++) a[i][i] += 100; // Preconditionning Jacobi=Diagonal(a) for (int i = 0; i < n; i++) pr[i] = a[i][i]; // Initial guess for (int i = 0; i < m; i++) for (int j = 0; j < ldx; j++) x[i][j] = 1; // Initial CPU time clock_t t_cpu_0 = clock(); double* pb = &b; double* pa = &a; double* px = &x; // Initial time. struct timeval t_elapsed_0; gettimeofday(&t_elapsed_0, NULL); double r[n]; #pragma omp parallel for schedule(runtime) private(r) for (int j = 0; j < m; j++) { double* b_j = pb + j * ldb; // b(1:n, j) double* x_j = px + j * ldx; // x(1:n, j) // r(:) = b(1:n,j) - matmul(a(1:n,1:n),x(1:n,j)) memcpy(&r[0], b_j, n * sizeof(double)); cblas_dgemv(CblasColMajor, CblasNoTrans, n, n, -1.0, pa, lda, x_j, 1, 1.0, r, 1); } // Final time struct timeval t_elapsed_1; gettimeofday(&t_elapsed_1, NULL); double t_elapsed = (t_elapsed_1.tv_sec - t_elapsed_0.tv_sec) + (t_elapsed_1.tv_usec - t_elapsed_0.tv_usec) / (double)1000000; // Final CPU time clock_t t_cpu_1 = clock(); double t_cpu = (t_cpu_1 - t_cpu_0) / (double)CLOCKS_PER_SEC; // Print results fprintf(stdout, "\n\n" " Elapsed time : %10.3E sec.\n" " CPU time : %10.3E sec.\n", t_elapsed, t_cpu); return EXIT_SUCCESS; }
已执行的构建与运行步骤
构建OpenBLAS库
$ brew install -i openblas $ make clean $ make USE_OPENMP=1 USE_LOCKING=1 CC=gcc FC=gfortran $ make USE_OPENMP=1 USE_LOCKING=1 CC=gcc FC=gfortran PREFIX=/your-path-to/openblas install
执行后提示“Install OK!”,但退出时出现“Error: Empty installation”错误,不过指定路径下已生成库文件,故忽略该提示。
编译代码
$ gcc -Xclang -fopenmp -I/your-path-to/libomp/include/ -L/your-path-to/libomp/lib/ -lomp \ -I/your-path-to/openblas/include -L/your-path-to/openblas/lib -lcblas main.c -o my_app
运行代码
$ export OPENBLAS_NUM_THREADS=1 OMP_SCHEDULE="STATIC,4" OMP_NUM_THREADS=4 $ ./my_app
OpenMP环境配置
OPENMP DISPLAY ENVIRONMENT BEGIN _OPENMP='201611' [host] OMP_AFFINITY_FORMAT='OMP: pid %P tid %i thread %n bound to OS proc set {%A}' [host] OMP_ALLOCATOR='omp_default_mem_alloc' [host] OMP_CANCELLATION='FALSE' [host] OMP_DEFAULT_DEVICE='0' [host] OMP_DISPLAY_AFFINITY='FALSE' [host] OMP_DISPLAY_ENV='TRUE' [host] OMP_DYNAMIC='FALSE' [host] OMP_MAX_ACTIVE_LEVELS='1' [host] OMP_MAX_TASK_PRIORITY='0' [host] OMP_NESTED: deprecated; max-active-levels-var=1 [host] OMP_NUM_TEAMS='0' [host] OMP_NUM_THREADS='4' [host] OMP_PROC_BIND='false' [host] OMP_SCHEDULE='static,4' [host] OMP_STACKSIZE='16M' [host] OMP_TARGET_OFFLOAD=DEFAULT [host] OMP_TEAMS_THREAD_LIMIT='0' [host] OMP_THREAD_LIMIT='2147483647' [host] OMP_TOOL='enabled' [host] OMP_TOOL_LIBRARIES: value is not defined [host] OMP_TOOL_VERBOSE_INIT: value is not defined [host] OMP_WAIT_POLICY='PASSIVE' OPENMP DISPLAY ENVIRONMENT END
恳请提供OpenMP与OpenBLAS协同工作的有效解决方案。
内容的提问来源于stack exchange,提问作者CBld
相关产品推荐
相关产品推荐

