在C

时间:2015-09-30 01:56:20

标签: c multithreading openmp

我在一段时间内使用带有多线程进程的函数。代码运行良好,但其他时间只是停止。我已经确定问题出在多线程过程中。我是多线程和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);
}

1 个答案:

答案 0 :(得分:1)

您的代码段中缺少太多信息以确定任何内容,但我至少可以给您一些可能出错的提示......

  1. 您可以将线程数设置为任意值,我认为该值可能非常大。但这并不是OpenMP的理念。实际上,在OpenMP中,您不希望线程数远远超出计算机上可用的核心或硬件线程数。我确信运行时库可以处理更多,但我也确定性能损失可能很严重,我甚至怀疑它可以管理的内容有限制。

  2. 您反复禁止嵌套并行。我想这样做一次就足够了,除非firethread()重新设置它。

  3. 您使用clock()计算时间是个不错的主意,因为它会占用当前线程及其所有子节点的CPU时间并对其求和,而不是报告挂起时间。所以你永远不会看到你是否有任何加速,你甚至会经历减速报告。请改用omp_get_wtime()

  4. 您的时间打印声明错误,只为格式列表中的一个打包了2个值。

  5. 这是对您的代码的暂时重写,我无法编译或测试,但我感觉更符合人们对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环境变量的设置。