当 "parallelizing" 多个 for 循环时,OpenMP `无效的控制谓词`
OpenMP ` invalid controlling predicate` when "parallelizing" more than one for loops
我正在尝试在 openMP 中创建一个并行块,其中包含多个 for 循环。到目前为止我所做的(或者至少我猜的重要部分,如果需要的话我可以 post 整个程序):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
int main(int argc, char**argv) {
[...]
int i, j, N=200, num_t=2;
[...]
M = (int) round(M);
[...]
double **u = malloc(N * sizeof(double));
for (i = 0; i < N; i++){
u[i] = (double*) malloc(M * sizeof(double));
}
/* Initialize time and space arrays */
double *x, *t;
x = (double*) malloc(N * sizeof(double));
t = (double*) malloc(M * sizeof(double));
#pragma omp parallel num_threads(num_t) private(i,j) shared(x,t,u,dt,dx,N,M,c) default(none)
{
#pragma omp for
for (i = 0; i < N; i++)
x[i] = 0 + i * dx;
#pragma omp for
for (i = 0; i < M; i++)
t[i] = 0 + i * dt;
/* Initial Conditions */
#pragma omp for
for (i = 0; i < N; i++) {
[do stuff with `u` array]
}
/* boundary conditions. */
#pragma omp for
for (j = 0; j < M; j++) {
[more stuff with `u` array]
}
#pragma omp for collapse(2)
for (j = 0; j< M - 1; j++) {
for(i = 1; i < N - 1; i ++) {
[even more stuff with `u` array].
}
}
}
以及为什么我尝试用 gcc -Wall -fopenmp -fsanitize=address exe1.c -o t1_1 -lm
编译它
我收到以下错误
exe1.c:56:15: error: invalid controlling predicate
for (i = 0; i < M; i++)
^
exe1.c:67:15: error: invalid controlling predicate
for (j = 0; j < M; j++) {
^
exe1.c:73:15: error: invalid controlling predicate
for (j = 0; j< M - 1; j++) {
我设法实际编译它的唯一方法是在第一个 #pragma omp for
:
之后结束并行块(不确定这是否是正确的术语)
#pragma omp parallel num_threads(num_t) private(i,j) shared(x,t,u,dt,dx,N,M,c) default(none)
{
#pragma omp for
for (i = 0; i < N; i++)
x[i] = 0 + i * dx;
}
我的 gcc 版本是 gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
和 openMP #define _OPENMP 201511
。
现在,我在这里阅读了很多关于此错误的 post (invalid controlling predicate
),但其中大部分似乎是由于不符合“规范循环形式”所致。认为我的代码确实符合。可能是什么问题?
谢谢:)
您在涉及 M
的循环中遇到错误,可能是因为 M
不是整数类型。支持这个假设的一个线索是你在某个时候四舍五入它的值:
M = (int) round(M);
不能在规范循环形式中使用浮点变量。所以这不起作用:
#pragma omp for
for (i = 0; i < M; i++)
t[i] = 0 + i * dt;
但这应该有效:
#pragma omp for
for (i = 0; i < (int)M; i++)
t[i] = 0 + i * dt;
我正在尝试在 openMP 中创建一个并行块,其中包含多个 for 循环。到目前为止我所做的(或者至少我猜的重要部分,如果需要的话我可以 post 整个程序):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
int main(int argc, char**argv) {
[...]
int i, j, N=200, num_t=2;
[...]
M = (int) round(M);
[...]
double **u = malloc(N * sizeof(double));
for (i = 0; i < N; i++){
u[i] = (double*) malloc(M * sizeof(double));
}
/* Initialize time and space arrays */
double *x, *t;
x = (double*) malloc(N * sizeof(double));
t = (double*) malloc(M * sizeof(double));
#pragma omp parallel num_threads(num_t) private(i,j) shared(x,t,u,dt,dx,N,M,c) default(none)
{
#pragma omp for
for (i = 0; i < N; i++)
x[i] = 0 + i * dx;
#pragma omp for
for (i = 0; i < M; i++)
t[i] = 0 + i * dt;
/* Initial Conditions */
#pragma omp for
for (i = 0; i < N; i++) {
[do stuff with `u` array]
}
/* boundary conditions. */
#pragma omp for
for (j = 0; j < M; j++) {
[more stuff with `u` array]
}
#pragma omp for collapse(2)
for (j = 0; j< M - 1; j++) {
for(i = 1; i < N - 1; i ++) {
[even more stuff with `u` array].
}
}
}
以及为什么我尝试用 gcc -Wall -fopenmp -fsanitize=address exe1.c -o t1_1 -lm
我收到以下错误
exe1.c:56:15: error: invalid controlling predicate
for (i = 0; i < M; i++)
^
exe1.c:67:15: error: invalid controlling predicate
for (j = 0; j < M; j++) {
^
exe1.c:73:15: error: invalid controlling predicate
for (j = 0; j< M - 1; j++) {
我设法实际编译它的唯一方法是在第一个 #pragma omp for
:
#pragma omp parallel num_threads(num_t) private(i,j) shared(x,t,u,dt,dx,N,M,c) default(none)
{
#pragma omp for
for (i = 0; i < N; i++)
x[i] = 0 + i * dx;
}
我的 gcc 版本是 gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
和 openMP #define _OPENMP 201511
。
现在,我在这里阅读了很多关于此错误的 post (invalid controlling predicate
),但其中大部分似乎是由于不符合“规范循环形式”所致。认为我的代码确实符合。可能是什么问题?
谢谢:)
您在涉及 M
的循环中遇到错误,可能是因为 M
不是整数类型。支持这个假设的一个线索是你在某个时候四舍五入它的值:
M = (int) round(M);
不能在规范循环形式中使用浮点变量。所以这不起作用:
#pragma omp for
for (i = 0; i < M; i++)
t[i] = 0 + i * dt;
但这应该有效:
#pragma omp for
for (i = 0; i < (int)M; i++)
t[i] = 0 + i * dt;