【问题标题】:OpenMP expected declaration or statement at end of input输入结束时的 OpenMP 预期声明或语句
【发布时间】:2020-08-20 13:04:58
【问题描述】:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <sys/time.h>


#define N 10000

int A[N][N];
int B[N][N];
int C[N][N];

int main(){

    int i,j,k;
    struct timeval tv1, tv2;
    struct timezone tz;
    double elapsed;
    for (i= 0; i< N; i++){
        for (j= 0; j< N; j++)
        {
            A[i][j] = 3;
            B[i][j] = 3;
        }
    }
    gettimeofday(&tv1, &tz);
    omp_set_num_threads(4);
    #pragma omp parallel default (private) shared (A,B,C,N) num_threads(4) 
    #pragma omp parallel for schedule(static)
    for (i = 0; i < N; ++i){
        for (j = 0; j < N; ++j){
            C[i][j]=0;
            for (k = 0; k < N; ++k){
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }


    gettimeofday(&tv2, &tz);
    elapsed = (double) (tv2.tv_sec-tv1.tv_sec) + (double) (tv2.tv_usec-tv1.tv_usec) * 1.e-6;
    printf("elapsed time = %f seconds.\n", elapsed);

    for (i= 0; i< N; i++){
            for (j= 0; j< N; j++) {
                printf("%d \t",C[i][j]);
            }
            printf("\n");
        }
}

此代码不起作用,尽管我确保每个“{”都正确!这段代码有什么问题?它是使用 OpenMp 库的矩阵乘法,我使用的是 eclipse c++ 知道代码有什么问题吗? 我得到“输入结束时的预期声明或声明}” 它在 printf("\n"); 下发光 我试图删除打印矩阵的整个东西,但它没有用

【问题讨论】:

  • 您遇到的错误是什么,代码在哪里? Edit 包含这些详细信息的问题。
  • 我在 input 的末尾得到了预期的声明或声明,它在 printf("\n"); 旁边发光,虽然我删除了整个打印的东西它不起作用

标签: c++ eclipse openmp


【解决方案1】:

我在Wandbox 上遇到以下错误:

prog.c: In function 'main':
prog.c:29:35: error: expected 'none' or 'shared' before 'private'
   29 |     #pragma omp parallel default (private) shared (A,B,C,N) num_threads(4)
      |                                   ^~~~~~~
prog.c:29:58: error: expected ')' before numeric constant
   29 |     #pragma omp parallel default (private) shared (A,B,C,N) num_threads(4)
      |                                                   ~      ^
      |                                                          )

首先,OpenMP default clause 没有选项private。 您应该删除default 子句并通过private clause 标记内部循环变量jk 私有。

其次,N 被定义为宏,扩展为10000。 它不是变量,因此不能在期望变量的 OpenMP 子句中指定。

【讨论】:

  • 编译器资源管理器对于查看不同编译器抛出的错误消息也很有用。例如。 godbolt.org/z/fVQxEg 以 icc 为例,但切换编译器很简单)。
  • 请不要在涉及 OpenMP 时参考 Microsoft 的文档。 Visual C++ 仅支持 OpenMP 2.0,规范的当前版本为 5.0,以 HTML 形式提供here
猜你喜欢
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多