OpenBLAS 仅为一个例程设置线程数
OpenBLAS set number of threads for one routine only
在 C++17 中,我想使用多个 OpenBLAS 子例程,每个子例程具有不同的线程数。有什么办法可以做到这一点?
以前我用过openblas_set_num_threads();
为我的 OpenBLAS 子例程设置线程数。虽然这有效,但它会全局设置 openblas num threads,防止每个子例程在 运行 并行时使用不同数量的线程。因此,我对所有 OpenBLAS 子例程使用相同数量的线程,因此它们可以 运行 并行。
不行!!目前看来是不可能的。
基于他们的 user manual:
If your application is already multi-threaded, it will conflict with
OpenBLAS multi-threading
实际上,这个特性对于大多数想要使用 BLAS 的多线程库来说是必不可少的。
一个简单的选择是使用 MKL 而不是 OpenBLAS,并使用它们的 mkl_set_num_threads_local
可以很好地发挥作用,并且开发人员可以很好地控制线程。 Look here.
一个更难的选择是调用单线程 OpenBLAS,然后你自己实现多线程。这可以与 OpenBLAS 和 MKL 一起使用,但它很麻烦,如果你不知道自己在做什么,你可能会失去性能。
对于这个问题,如果你使用 C++17、C++11、C++ 或 C 的任何其他版本,都没有区别。
在 C++17 中,我想使用多个 OpenBLAS 子例程,每个子例程具有不同的线程数。有什么办法可以做到这一点?
以前我用过openblas_set_num_threads(); 为我的 OpenBLAS 子例程设置线程数。虽然这有效,但它会全局设置 openblas num threads,防止每个子例程在 运行 并行时使用不同数量的线程。因此,我对所有 OpenBLAS 子例程使用相同数量的线程,因此它们可以 运行 并行。
不行!!目前看来是不可能的。 基于他们的 user manual:
If your application is already multi-threaded, it will conflict with OpenBLAS multi-threading
实际上,这个特性对于大多数想要使用 BLAS 的多线程库来说是必不可少的。
一个简单的选择是使用 MKL 而不是 OpenBLAS,并使用它们的 mkl_set_num_threads_local
可以很好地发挥作用,并且开发人员可以很好地控制线程。 Look here.
一个更难的选择是调用单线程 OpenBLAS,然后你自己实现多线程。这可以与 OpenBLAS 和 MKL 一起使用,但它很麻烦,如果你不知道自己在做什么,你可能会失去性能。
对于这个问题,如果你使用 C++17、C++11、C++ 或 C 的任何其他版本,都没有区别。