Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 用OpenMP实现列表排序——输出错误_C_Openmp_Pragma - Fatal编程技术网

C 用OpenMP实现列表排序——输出错误

C 用OpenMP实现列表排序——输出错误,c,openmp,pragma,C,Openmp,Pragma,下面的代码显示了我用OpenMP实现的列表排序算法。当我在没有pragmas的情况下执行这段代码时,我会得到正确的结果,但是当我包含pragmas时,我会在输出中(偶尔)出现错误。输出显示在底部。您可以看到第二次输出是错误的。这是随机发生的当我删除pragmas时,我的输出总是正确的。我使用pragmas的方式是否有错误,或者是否缺少依赖项。 (顺序输出为预期输出。当并行输出与顺序输出匹配时,程序打印数据正常) 螺纹的长度和数量为16 #define NSIZE 1 #define NMAX 1

下面的代码显示了我用OpenMP实现的列表排序算法。当我在没有pragmas的情况下执行这段代码时,我会得到正确的结果,但是当我包含pragmas时,我会在输出中(偶尔)出现错误。输出显示在底部。您可以看到第二次输出是错误的。这是随机发生的当我删除pragmas时,我的输出总是正确的。我使用pragmas的方式是否有错误,或者是否缺少依赖项。 (顺序输出为预期输出。当并行输出与顺序输出匹配时,程序打印数据正常)

螺纹的长度和数量为16

#define NSIZE 1
#define NMAX 16
int Ns[NSIZE] = {16};
int A[NMAX] = {14,13,5,16,11,10,9,12,0,8,7,15,4,3,2,1}; 
int B[NMAX + 1] = {0};

int S[NMAX + 1] = {0};

int Rp[NMAX + 1] = {0};
int next[NMAX+1] = {0};

for(int i = 1, j=0; i <= n; i++, j++)
{
    B[i] = A[j];

}

int chunk = ceil(length/nthreads);
int i, j;
int tid;
//#pragma omp parallel num_threads(nthreads)
//{
//#pragma omp for schedule(dynamic, chunk) private(i)
for(i = 1; i <= length; i++)
{

    Rp[i] = 1;
    next[i] = S[i];
}


for(i = 1; i<=log2(length); i++)
{
#pragma omp parallel num_threads(nthreads) shared(Rp,next,chunk) private(j)
{
    #pragma omp for schedule(dynamic,chunk)
    for(j = 1; j <= length; j++)
    {
        if(next[j]!=0)
        {
            Rp[j] = Rp[j] + Rp[next[j]];

            next[j] = next[next[j]];
        }
    }

}
}
#定义NSIZE 1
#定义NMAX 16
int Ns[NSIZE]={16};
int A[NMAX]={14,13,5,16,11,10,9,12,0,8,7,15,4,3,2,1};
int B[NMAX+1]={0};
int S[NMAX+1]={0};
int Rp[NMAX+1]={0};
int next[NMAX+1]={0};

对于(inti=1,j=0;i我认为这应该可以通过第二组数组实现。 如果我错了,请纠正我

当您使用两个数组和两个指针
next\u new
next\u old
以及两个数组和两个指针
Rp\u new
Rp\u old
时,它应该可以做到这一点

您向新的数组写入数据,同时从旧的中读取数据,并在每一轮之后交换指针

Rp_new[j] = Rp_old[j] + Rp_old[next_old[j]];

next_new[j] = next_old[next_old[j]];

请您的问题包括实际输出。
Rp
next
S
在哪里定义?输出中的随机错误是什么,是实际错误还是意外输出?(请包括实际输出和预期输出)您在这里有一个竞争条件:
next[j]=next[j]]
。事实上,这取决于您运行
j
循环的顺序,因此尝试并行化只会改变顺序,然后可能会改变结果。@Gilles感谢您的回答。我通过将if循环置于关键区域来消除竞争条件。但这意味着我现在有效地运行了有没有其他方法可以消除竞争(我不想改变算法)。实际上,这不仅仅是一个竞争条件。问题在于,该算法从根本上说是不可并行的,因为执行顺序或
j
循环在这里很重要。因此,您可以不用使用
ordered
指令,但最终会得到一个顺序算法。因此,如果您希望要使它真正并行,你必须从根本上改变你的算法。