我正在尝试使用OpenMP并行化(C ++)来减少算法的计算时间。 我尝试过简单的事情,但我不太明白它是如何运作的......
这是我的代码:
int nthread = omp_get_max_threads();
#pragma omp parallel for num_threads(nthread)
for(int i=0;i<24;++i)
std::cout << omp_get_thread_num() << std::endl;
在我的电脑上,nthread = 6.我不明白为什么输出是:
0
0
0
... (24 times)
为什么不给我的数字从0到5?
如果我理解得很好(如果我错了就纠正我),在这段代码中,有6个线程将执行std :: cout命令。 那么,为什么我只有“0”作为输出?
第二件事:我想在每个线程中执行循环的某个部分。我想在6(nthread)不同的部分划分我的循环,这样每个部分都可以由不同的线程执行。
在这里,我希望我的6个线程中的每一个都执行
std::cout << omp_get_thread_num() << std::endl;
4次。
我该怎么办?我试过这个:
#pragma omp parallel for num_threads(nthread)
for(int i=omp_get_thread_num()*(24/nthread);i<(omp_get_thread_num()+1)*(24/nthread);++i)
std::cout << omp_get_thread_num() << std::endl;
是不是?我的输出是:
0
0
0
0
在终端中只有“0”线程而没有其他线程是否正常?
谢谢
答案 0 :(得分:0)
只有部分答案,但我无法保持沉默
我试过了:
for(int i=omp_get_thread_num()*(24/nthread);i<(omp_get_thread_num()+1)*(24/nthread);++i)
std::cout << omp_get_thread_num() << std::endl;
是不是?
不,这不对,根本不对!代码正在完成跨线程划分迭代的工作,一个更好的模型将是
for(int i=0;i<max_iters;++i)
do work depending on i
并且编译器/运行时将负责跨线程划分工作。每个线程都将获得自己的一组值i
来处理。
这个简单模式只有在循环中的每个任务独立于其他任务时才是正确的,因此work(i)
和work(i-1)
之间没有依赖关系。但在开始时,这可能足以让你开始。
至于你的其余问题,看起来好像你并没有实际并行运行代码。我建议更换
int nthread = omp_get_max_threads();
#pragma omp parallel for num_threads(nthread)
与
#pragma omp parallel for
即,将线程数保留为默认设置。如果这不起作用,请使用进一步调查的结果编辑您的问题。仔细看看SO,我相当肯定你会发现副本。
答案 1 :(得分:0)
RyanP,你是对的,我错过了关键字openmp。 我加了它,现在效果很好!非常感谢。
还要感谢高绩效标记的答案,
preg_match_all("/finalPrice\\":\\"([0-9.]{1,10})\\"/", $page_html, $output_array);
足以满足我的目的。
我知道
#pragma omp parallel for
错了,但是因为我试过的其他事情都没有用,所以我尝试了疯狂的事情。谢谢你的解释,现在它更清楚了。
要解决我的问题,我只需在我的CMakeList.txt中添加以下行:
for(int i=omp_get_thread_num()*(24/nthread);i<(omp_get_thread_num()+1)*(24/nthread);++i)
std::cout << omp_get_thread_num() << std::endl;
效果很好。
谢谢大家