如何解决OpenBLAS 将仅使用 4 个线程,但有 32 个可用
最近,我在 Windows 10 上使用适用于 Linux 的 Windows 子系统安装了 OpenBLAS,以便我可以在 C++ 中运行优化的矩阵计算,但是我认为该库没有充分利用我正在运行它的硬件。
例如,如果我运行一个简单的 dgemm
调用来将两个 10,000x10,000 矩阵相乘,运行大约需要 10-11 秒,而 numpy
在完全相同大小的矩阵上运行,使用相同的数据类型 (double
/float64
),只需 4-5 秒。查看任务管理器,似乎 numpy
能够使用我的 32 个线程中的大约 16 个,而 OpenBLAS 仅使用 4 个(这在我运行 openblas_get_num_threads()
时得到证实)
即使在明确告诉 OpenBLAS 使用更多之后,我仍然使用了 4 个线程,如下面的代码所示:
openblas_set_num_threads(8); // This should set the number of OpenBLAS threads to 8
goto_set_num_threads(8); // This should also set the number of OpenBLAS threads to 8
std::cout << "OpenBLAS number of threads: " << openblas_get_num_threads() << "\n"; // Always gives 4
std::cout << "Number of cores: " << openblas_get_num_procs() << "\n"; // 32 (correct)
std::cout << "Parallel type: " << openblas_get_parallel() << "\n"; // 1 -- Default parallel type -- i.e. no OpenMP
我的问题是,是否在 libopenblas.lib
文件或其他地方设置了 4 个线程的硬编码限制,或者我可以做些什么来使 dgemm
调用在更多线程上运行并且提高性能,理想情况下达到或超过 numpy
的时间?
提前致谢
============ 编辑 ============
我对此进行了更多研究,发现实际上设置了 4 个线程的限制,但是我找不到更改此设置的方法。我尝试在 make
配置中设置它,如下所示:
make MAX_THREADS=32 ......
但这并没有改变任何东西。有没有办法解决这个问题?
这是我如何发现设置限制为 4:
std::cout << "Config type: " << openblas_get_config() << "\n"; // ... MAX_THREADS=4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。