Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenMp和#pragma omp,用于在c中了解它是如何工作的,以及如何检查它是否实现了他的目标_C_Multithreading_Parallel Processing_Openmp_Magic Square - Fatal编程技术网

OpenMp和#pragma omp,用于在c中了解它是如何工作的,以及如何检查它是否实现了他的目标

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

我用C语言编写了一个带有OpenMP的魔方程序,试图让它变得更快。然而,我的时间比顺序实现的时间要长

我不知道我是否以一种良好的方式进行omp,我也不知道循环是否正在扩展到线程中,它应该如何变得更快,或者我是否应该使用其他方法,有人能帮助我吗

我的示例代码:

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