OPENMP_为什么写入数组这么慢,怎么能让它快速?

时间:2014-10-22 00:48:54

标签: c arrays openmp

//serial enum sort
double serial_enum_sort(int a[], int at[])
{
    double t1, t2;
    t1 = omp_get_wtime();
    int k, i, j;
    for(i = 1; i <= MAXN; i++)
    {
        k = 1;
        for(j = 1; j <= MAXN; j++)
            if(a[i] > a[j] || (a[i] == a[j] && i>j))
                k++;
        at[k] = a[i];
    }
    t2 = omp_get_wtime();
    return (t2 - t1);
}


// parallel enum sort
double parallel_enum_sort(int b[], int bt[])
{
    double t1, t2;
    t1 = omp_get_wtime();
    int k, i, j, id;
    #pragma omp parallel  private(k, i, j, id)
    {
        id = omp_get_thread_num()+1;
        // printf("%d\n", id);
        for(i = id; i <= MAXN; i += NUM_THREADS)
        {
            k = 1;
            for(j = 1; j <= MAXN;  j++)
                if(b[i] > b[j] || (b[i] == b[j] && i > j))
                    k++;
            bt[k] = b[i];
        }
    }
    t2 = omp_get_wtime();
    return (t2 - t1);
}

这是一个带有openmp的enum_sort程序。我认为bt [k] = b [i]花费的时间最多。我怎样才能改进它?我的编译器是gcc4.8.2,我的操作系统是Linux mint

1 个答案:

答案 0 :(得分:0)

在我看来,好像你已经用pragma

声明了一个并行区域
#pragma omp parallel  private(k, i, j, id)

但未声明任何并行工作共享。你可以通过替换

来做到这一点
for(i = id; i <= MAXN; i += NUM_THREADS)

#pragma omp for
for(i = id; i <= MAXN; i += NUM_THREADS)

正如您所展示的程序一样,我们并行执行,但所有线程都执行整个任务 - 工作不会共享。你也可以写一个pragma

#pragma omp parallel for private(k, i, j, id)

并对其余代码进行必要的调整;例如,for语句必须在下一行。

注意:我没有检查过您的代码无需进一步修改即可正确快速地执行。