我的c程序应该使用openmp在多个线程中运行,但事实并非如此

时间:2014-11-19 16:22:19

标签: c arrays multithreading openmp

这是我的代码的一部分。它应该使用openmp来运行此部分,其中包含尽可能多的线程,但它仍然作为一个线程运行。代码的这一部分正在搜索数组并检查该值是否在某个限制范围内。 R和c是表示数组的行和列的整数。 equals方法检查数组中的值是否在限制范围内。如果标记了详细信息,那么数组中的值将被赋予add_list方法,该方法将打印出来。

#pragma omp parallel for private(r,c)

for (r = 0; r < shared_data->sh_rct; r++)
{
    for (c = 0; c < shared_data->sh_cct; c++)
    {
        equals = (approxEqual(sh_rows[r][c], ref, tol) == 1);

        if(equals)
        {
            #pragma omp atomic

            sh_count++; 

            /*if verbose is true add the match to a list that will be printed out*/
            if(verbose)
            {
                print_list = add_list(print_list, r, c, sh_rows[r][c], omp_get_thread_num());
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我想这个问题只有两种可能性。

  1. shared_data->sh_rct == 1.在这种情况下,没有什么可以并行运行。
  2. OpenMP运行时被告知将线程数限制为只有一个。
  3. 后者可能由以下原因引起:

    • 事先致电omp_set_num_threads(1)
    • OMP_NUM_THREADS环境变量设置为1
    • 在某些情况下,事先致电omp_set_dynamic(1)OMP_DYNAMIC=TRUE可能会导致相同的行为。
    • 允许该进程仅在一个核心上运行。例如。 taskset -c1 ./your_app