gpt4 book ai didi

c - OPENMP_为什么写数组这么慢,我怎样才能让它更快?

转载 作者:行者123 更新时间:2023-11-30 19:45:24 26 4
gpt4 key购买 nike

//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 声明了一个并行区域

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com