我在一段时间内使用带有多线程进程的函数。代码运行良好,但其他时间只是停止。我已经确定问题出在多线程过程中。我是多线程和OpenMP的新手......如果有人有提示解决这个问题......我将非常感激。 XP
void paralelSim(PetriNet *p, Matrix *mconflit, int steps){
Matrix ring;
choicesRing(p, mconflit, &ring);
clock_t t;
t = clock();
while((ring.row!=0) && ((steps>0) || (steps == CONTINUE))){
omp_set_dynamic(0);
omp_set_num_threads(ring.col);
#pragma omp parallel shared(p)
{
firethread(p, ring.m[0][omp_get_thread_num()]);
}
if(steps != CONTINUE){
steps--;
}
choicesRing(p, mconflit, &ring);
}
t= clock() - t;
printf("%f seconds.\n",t,((float)t)/CLOCKS_PER_SEC);
printf("m:\n");
showMatrix(&p->m);
printf("steps: %d\n", p->steps);
}
答案 0 :(得分:1)
您的代码段中缺少太多信息以确定任何内容,但我至少可以给您一些可能出错的提示......
您可以将线程数设置为任意值,我认为该值可能非常大。但这并不是OpenMP的理念。实际上,在OpenMP中,您不希望线程数远远超出计算机上可用的核心或硬件线程数。我确信运行时库可以处理更多,但我也确定性能损失可能很严重,我甚至怀疑它可以管理的内容有限制。
您反复禁止嵌套并行。我想这样做一次就足够了,除非firethread()
重新设置它。
您使用clock()
计算时间是个不错的主意,因为它会占用当前线程及其所有子节点的CPU时间并对其求和,而不是报告挂起时间。所以你永远不会看到你是否有任何加速,你甚至会经历减速报告。请改用omp_get_wtime()
。
您的时间打印声明错误,只为格式列表中的一个打包了2个值。
这是对您的代码的暂时重写,我无法编译或测试,但我感觉更符合人们对OpenMP代码的期望。也许它会改善/解决你的问题。
void paralelSim(PetriNet *p, Matrix *mconflit, int steps){
Matrix ring;
omp_set_dynamic(0);
choicesRing(p, mconflit, &ring);
double t = omp_get_wtime();
while((ring.row!=0) && ((steps>0) || (steps == CONTINUE))){
#pragma omp parallel for
for(int i=0; i<ring.col; ++i)
firethread(p, ring.m[0][i]);
if(steps != CONTINUE){
steps--;
}
choicesRing(p, mconflit, &ring);
}
t = omp_get_wtime() - t;
printf("%f seconds.\n",t);
printf("m:\n");
showMatrix(&p->m);
printf("steps: %d\n", p->steps);
}
同样,我甚至没有编译这个,所以可能(可能)有一些错别字。此外,如果它有效但不能提供预期的性能,您可以考虑将omp parallel
部分移到while
循环之外,并在需要时使用一些omp single
。
最后,由于我不知道您计划运行多少个核心,因此我没有明确设置线程数。目前,这将依赖于您的环境的默认设置或您对OMP_NUM_THREADS
环境变量的设置。