OpenMP parallel 用于减慢我的代码(C 语言)
OpenMP parallel for slow down my code (C language)
我正在尝试使用 openMP 来加速列表排名的并行版本。我的实现如下:
int ListRankingParallel(int *R1,int *S, int N)
{
int i;
int *Q = (int*)malloc(N * sizeof(int));
#pragma omp parallel for private(i)
for (i=0; i<N; i++){
if( S[i] != -1)R1[i] = 1;
else R1[i] = 0;
Q[i] = S[i];
}
#pragma omp parallel for private(i)
for(i=0; i<N; i++)
while (Q[i] != -1 & Q[Q[i]] != -1) {
R1[i] = R1[i] + R1[Q[i]];
Q[i] = Q[Q[i]];
}
free(Q);
return *R1;
}
我的榜单排名连载版是
int ListRankingSerial(int *R2,int *S, int N)
{
int temp;
int j,i;
for( i=0; i<N; i++){
j = 0;
temp = S[i];
while(S[i]!=-1)
{
j++;
S[i] = S[S[i]];
}
R2[i] = j;
S[i] = temp;
}
return *R2;
}
当我分别运行他们时,使用
get_walltime(&S1);
ListRankingParallel(R1,S,N);
get_walltime(&E1);
get_walltime(&S3);
ListRankingSerial(R3,S,N);
get_walltime(&E3);
如果我 运行 我的代码在我的 Mac 上,并行版本 运行 比串行版本快得多。但是,如果我 运行 它在另一个 linux 集群上,并行版本比串行版本慢两倍。
在我的 mac 上,我使用
编译我的代码
gcc-7 -fopenmp <file name>.c
在集群上,使用
gcc -fopenmp <file name>.c
如果你想测试我的代码,请使用:
int main(){
int N = 1e+5;
int *S = (int*)malloc(N * sizeof(int));
int *R1 = (int*)malloc(N * sizeof(int));
int *R3 = (int*)malloc(N * sizeof(int));
double S1,S2,S3,E1,E2,E3;
int i;
for( i = 0; i < N; i++)
S[i] = i+1;
S[N-1] = -1;
get_walltime(&S1);
ListRankingParallel(R1,S,N);
get_walltime(&E1);
printf("%f\n",E1-S1);
get_walltime(&S3);
ListRankingSerial(R3,S,N);
get_walltime(&E3);
printf("%f\n",E3-S3);
}
有人可以给我一些建议吗?谢谢!
您确定它是 运行 在多个线程上吗?
您应该设置
OMP_NUM_THREADS
环境变量
或致电
omp_set_num_threads()
在主要的开始。您可以使用 omp_get_max_threads()
获取可用线程总数并执行类似
的操作
max_threads = omp_get_max_threads()
omp_set_num_threads(max_threads)
在 this answer 中查看有关设置线程数的更多信息。
编辑:您还可以检查 omp_get_num_threads()
.
使用了多少线程
我正在尝试使用 openMP 来加速列表排名的并行版本。我的实现如下:
int ListRankingParallel(int *R1,int *S, int N)
{
int i;
int *Q = (int*)malloc(N * sizeof(int));
#pragma omp parallel for private(i)
for (i=0; i<N; i++){
if( S[i] != -1)R1[i] = 1;
else R1[i] = 0;
Q[i] = S[i];
}
#pragma omp parallel for private(i)
for(i=0; i<N; i++)
while (Q[i] != -1 & Q[Q[i]] != -1) {
R1[i] = R1[i] + R1[Q[i]];
Q[i] = Q[Q[i]];
}
free(Q);
return *R1;
}
我的榜单排名连载版是
int ListRankingSerial(int *R2,int *S, int N)
{
int temp;
int j,i;
for( i=0; i<N; i++){
j = 0;
temp = S[i];
while(S[i]!=-1)
{
j++;
S[i] = S[S[i]];
}
R2[i] = j;
S[i] = temp;
}
return *R2;
}
当我分别运行他们时,使用
get_walltime(&S1);
ListRankingParallel(R1,S,N);
get_walltime(&E1);
get_walltime(&S3);
ListRankingSerial(R3,S,N);
get_walltime(&E3);
如果我 运行 我的代码在我的 Mac 上,并行版本 运行 比串行版本快得多。但是,如果我 运行 它在另一个 linux 集群上,并行版本比串行版本慢两倍。
在我的 mac 上,我使用
编译我的代码gcc-7 -fopenmp <file name>.c
在集群上,使用
gcc -fopenmp <file name>.c
如果你想测试我的代码,请使用:
int main(){
int N = 1e+5;
int *S = (int*)malloc(N * sizeof(int));
int *R1 = (int*)malloc(N * sizeof(int));
int *R3 = (int*)malloc(N * sizeof(int));
double S1,S2,S3,E1,E2,E3;
int i;
for( i = 0; i < N; i++)
S[i] = i+1;
S[N-1] = -1;
get_walltime(&S1);
ListRankingParallel(R1,S,N);
get_walltime(&E1);
printf("%f\n",E1-S1);
get_walltime(&S3);
ListRankingSerial(R3,S,N);
get_walltime(&E3);
printf("%f\n",E3-S3);
}
有人可以给我一些建议吗?谢谢!
您确定它是 运行 在多个线程上吗?
您应该设置
OMP_NUM_THREADS
环境变量
或致电
omp_set_num_threads()
在主要的开始。您可以使用 omp_get_max_threads()
获取可用线程总数并执行类似
max_threads = omp_get_max_threads()
omp_set_num_threads(max_threads)
在 this answer 中查看有关设置线程数的更多信息。
编辑:您还可以检查 omp_get_num_threads()
.