这是我的代码:
std::cout << omp_get_thread_num() << std::endl;
其中values_是在double上模板化的std :: vector,DIM类似于1024。
我用&#39; g ++ -std = c ++ 14 -fopenmp -g&#39;
编译它即使我有多个线程,但当我不使用OpenMP时,我得到的性能几乎没有差别。
确实,这句话:
$DebugPreference = “Continue”
write-debug (Get-AzureRmStorageAccountKey -ResourceGroupName "USWest" -AccountName "mystorageaccountname")
表明线程一次只执行一次......
输出是干净的,类似于11111 ...,22222 ......,00000 ......,33333 ...而htop只显示一个100%的核心,整个执行过程中同一个核心
我已尝试过几台配有多个发行版的机器,它们无处不在。
答案 0 :(得分:1)
您可能希望像这样重写代码,以防止I / O的巨大开销(也或多或少地序列化程序执行):
template <unsigned int DIM>
MyVector<DIM> MyVector<DIM>::operator+(MyVector& other) {
MyVector ans = MyVector<DIM>();
#pragma omp parallel
{
#pragma omp critical(console_io)
{
// The following are actually two function calls and a critical
// region is needed in order to ensure I/O atomicity
std::cout << omp_get_thread_num() << std::endl;
}
#pragma omp for schedule(static)
for (unsigned int i = 0; i < DIM; ++i)
{
ans.values_[i] = values_[i] + other.values_[i];
}
}
return ans;
}
确保DIM
足够大,以便OpenMP的开销与正在完成的工作相比较小,并且同时足够小以使向量适合CPU的最后一级缓存。一旦后者不再是这种情况,你的循环就会受内存限制,添加新线程不会导致更快的计算。