C OpenMP递增计数并将值分配给数组

C OpenMP递增计数并将值分配给数组,c,openmp,C,Openmp,我是OpenMP新手,不确定这段代码出了什么问题,结果没有意义 谢谢 您的代码有多个bug。让我们先解决这个愚蠢的问题。写入N+1元素,但只分配N元素。将N更改为21,然后更改 for (int i = 0; i <= N; i++) 如果你真的想使用一个感应变量,那么你必须这样做: #pragma omp parallel { int ithread = omp_get_thread_num(); int nthreads = omp_get_num_threads()

我是OpenMP新手,不确定这段代码出了什么问题,结果没有意义

谢谢
您的代码有多个bug。让我们先解决这个愚蠢的问题。写入
N+1
元素,但只分配
N
元素。将
N
更改为21,然后更改

for (int i = 0; i <= N; i++)
如果你真的想使用一个感应变量,那么你必须这样做:

#pragma omp parallel
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    int start = ithread*N/nthreads;
    int finish = (ithread + 1)*N/nthreads;

    int j = start / 2;
    if (start % 2) j++;
    for (int i = start; i < finish; i++) {
        if ((i % 2) == 0) j++;
        A[i] = j;
    }
}
cnt = N/2;

“没有意义”告诉我们的不多。包括你的结果和你想要的结果。@Z玻色子我非常感谢你的投入。在平行范式下,我变得残疾。
for (int i = 0; i <= N; i++)
for (int i = 0; i < N; i++)
#pragma omp parallel for
for (int i = 0; i < N; i++) {
    int j = i / 2 + 1;
    A[i] = j;
}
cnt = N/2;
#pragma omp parallel for reduction(+:cnt)
for (int i = 0; i < N; i++) {
    if ((i % 2) == 0) cnt++;
    int j = i / 2 + 1;
    A[i] = j;
}
#pragma omp parallel
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    int start = ithread*N/nthreads;
    int finish = (ithread + 1)*N/nthreads;

    int j = start / 2;
    if (start % 2) j++;
    for (int i = start; i < finish; i++) {
        if ((i % 2) == 0) j++;
        A[i] = j;
    }
}
cnt = N/2;
#pragma omp parallel reduction(+:cnt)
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    int start = ithread*N/nthreads;
    int finish = (ithread + 1)*N/nthreads;

    int j = start / 2;
    if (start % 2) j++;
    for (int i = start; i <finish; i++) {
        if ((i % 2) == 0) {
            j++; cnt++;
        } 
        A[i] = j;
    }
}