//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

最佳答案

在我看来,您好像已经声明了平行区域,

#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 omp parallel for private(k, i, j, id)


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

注意:我没有检查您的代码是否可以在不进行进一步修改的情况下正确,快速地执行。

关于c - OPENMP_为什么写数组这么慢,我怎么能快呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26498732/

10-13 01:07