You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:09:53