OpenMp和#pragma omp,用于在c中了解它是如何工作的,以及如何检查它是否实现了他的目标
我用C语言编写了一个带有OpenMP的魔方程序,试图让它变得更快。然而,我的时间比顺序实现的时间要长 我不知道我是否以一种良好的方式进行omp,我也不知道循环是否正在扩展到线程中,它应该如何变得更快,或者我是否应该使用其他方法,有人能帮助我吗 我的示例代码:OpenMp和#pragma omp,用于在c中了解它是如何工作的,以及如何检查它是否实现了他的目标,c,multithreading,parallel-processing,openmp,magic-square,C,Multithreading,Parallel Processing,Openmp,Magic Square,我用C语言编写了一个带有OpenMP的魔方程序,试图让它变得更快。然而,我的时间比顺序实现的时间要长 我不知道我是否以一种良好的方式进行omp,我也不知道循环是否正在扩展到线程中,它应该如何变得更快,或者我是否应该使用其他方法,有人能帮助我吗 我的示例代码: #pragma omp parallel private(i,j) { //soma diagonal principal #pragma omp for for( i = 0; i < size; i++
#pragma omp parallel private(i,j)
{
//soma diagonal principal
#pragma omp for
for( i = 0; i < size; i++)
sum += matrix[i][i];
#pragma omp for
for( i = 0; i < size; i++)
sumAux += matrix[i][size-i-1];
//printf("\nSoma diagonal principal %i e secundária %i\n", sum, sumAux);
//------------------------------------------LINHAS E COLUNAS-----------------------------------------------------------
#pragma omp for
for(int i = 0; i < size; i++) {
sumRow = 0;
sumCol = 0;
for(int j = 0; j < size; j++) {
sumRow += matrix[i][j];
sumCol += matrix[j][i];
}
//printf("soma Linhas %i\n",sumRow );
//printf("soma Colunas %i\n",sumCol );
}
}
//------------------------------------------PRINTS-----------------------------------------------------------
if (sum == sumCol && sum==sumRow && sum==sumAux ) {
printf("Quadrado magico com sum = %d \n", sum);
} else {
printf("Quadrado nao magico \n");
}
return 0;
}
#pragma omp parallel private(i,j)
{
//体对角主
#pragma omp for
对于(i=0;i
代码有几个竞争条件,即变量sum
、sumax
、sumRow
和sumCol
的更新。此外,这:
for(int i = 0; i < size; i++) {
sumRow = 0;
sumCol = 0;
for(int j = 0; j < size; j++) {
sumRow += matrix[i][j];
sumCol += matrix[j][i];
}
}
但是我的时间比顺序执行的时间要高
在代码中引入OpenMP或并行性并不能神奇地提高代码的速度TL;DR并行完成的工作应该足够大,以克服并行的开销(例如,线程创建、同步等)。要做到这一点,您首先需要增加并行任务的大小,即通过将输入大小增加到可以证明上述并行开销的值。为什么在每次迭代中将sumRow和sumCol的值设置为零?“尝试更快”:线程创建和通信代价高昂。对于如此小的输入和工作负载,这是毫无意义的:生成的多线程代码可能会更慢,因为顺序计算可能会在创建线程之前结束。如果您的目标实际上是更快,那么您需要改进顺序代码,而不是在这里使用多线程。您可以从展平矩阵开始,了解SIMD并行性,并启用编译器优化标志。@dreamcrash sry是的,我是该站点的新手,ty so mutch感谢您的支持,它对我帮助很大!!
int sum = 0, sum2 = 0;
for (int i = 0; i < size; i++){
sum = sum + mat[i][i];
sum2 = sum2 + mat[i][size-1-i];
}
if(sum!=sum2)
return 0;
for (int i = 0; i < size; i++) {
int rowSum = 0;
int colSum = 0;
for (int j = 0; j < size; j++){
rowSum += mat[i][j];
colSum += mat[j][i];
}
if (rowSum != sum || sum != colSum)
return 0;
}
return 1;
int sum = 0, sum2 = 0;
#pragma omp parallel for reduction(+:sum, sum2)
for (int i = 0; i < size; i++){
sum = sum + mat[i][i];
sum2 = sum2 + mat[i][N-1-i];
}
if(sum!=sum2)
return 0;
for (int i = 0; i < size; i++) {
int rowSum = 0;
int colSum = 0;
#pragma omp parallel for reduction(+:rowSum, colSum)
for (int j = 0; j < size; j++){
rowSum += mat[i][j];
colSum += mat[j][i];
}
if (rowSum != sum || sum != colSum)
return 0;
}
return 1;