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