我在Windows11中使用VisualStudio2019创建了一个空的C++项目。
然后,我使用OpenMP运行了这段最小的代码来测试多线程:
#include <iostream>
#include <omp.h>
int main() {
omp_set_dynamic(0); // ensure that the number of threads doesn't change due to system demands
omp_set_num_threads(16);
std::cout << "Max threads: " << omp_get_max_threads() << "\n";
int id;
#pragma omp parallel private(id)
{
std::cout << "Number of threads running in parallel: " << omp_get_num_threads() << "\n";
std::cout << "Thread ID in parallel region: " << omp_get_thread_num() << "\n";
}
return 0;
}
这是我得到的输出:
最大线程: 16 并行运行的线程数:1 并行区域中的线程ID :0
我首先在CMake项目中尝试多线程(使用CMake 3.22和将OpenMP包含在CMake项目中的现代方法),并尝试使用VisualStudio2019和2022编译器。结果是一样的,我不能得到超过一个线程并行运行。于是,我在Visual 2019中尝试了这个简单的例子,并遇到了同样的问题。
我想知道是否有一些Windows规则/设置限制了我可以使用的线程数量。顺便说一句,利用Matlab2021b和并行计算工具箱,我成功地使用了多线程(8/16线程)。
如果你需要关于这个问题/我的系统的任何其他信息,请不要犹豫地问我。
谢谢。
编辑:
我从CMake获得以下输出
"C:\Program \JetBrains\CLion 2022.1.1\bin\cmake\win\bin\cmake.exe“-DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_Program=C:/Program/JetBrains/Clien2022.1.1/bin/ Ninja /win/ninja.exe”-G Ninja -S -B -B“
完成
发布于 2022-08-02 08:17:57
好吧,真正的新秀错误。
首先,我没有将/openmp标志添加到CMAKE_CXX_FLAGS中,这在CMAKE_CXX_FLAGS中是必要的(我认为find_package(OpenMP)就足够了,而添加-fopenmp,就像在Linux中一样,没有被识别,所以我跳过了)。
即使在我做完之后,它也不起作用。原因是我正在构建的项目也使用CUDA,我从一个.cu文件调用OpenMP-多线程代码,它当然是用NVCC编译的,它不知道CXX标志,而且很可能没有任何理由支持它们。因此,我需要将OpenMP多线程代码移动到.cpp文件中,这样它才能正常工作。我没有提到我的项目一开始也在使用CUDA,因为我不认为这会引起问题(愚蠢的我)。
无论如何,谢谢你的帮助,杰罗姆。
https://stackoverflow.com/questions/73191905
复制相似问题