Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Parallel processing PGI编译器并行化&x2B=_Parallel Processing_Compiler Flags_Pgi - Fatal编程技术网

Parallel processing PGI编译器并行化&x2B=

Parallel processing PGI编译器并行化&x2B=,parallel-processing,compiler-flags,pgi,Parallel Processing,Compiler Flags,Pgi,我正在将向量和矩阵类并行化,遇到了一个问题。任何时候我有一个循环的形式 对于(int i=0;i

我正在将向量和矩阵类并行化,遇到了一个问题。任何时候我有一个循环的形式

对于(int i=0;i 该代码具有数据依赖性,不会并行化。在使用英特尔编译器时,它足够聪明,可以在不使用任何杂注的情况下处理此问题(我希望避免使用杂注进行无依赖性检查,因为类似于此的循环非常多,而且情况实际上比这更复杂,我希望它只在存在一个杂注的情况下进行检查)

有人知道PGI编译器的编译器标志允许这样做吗

谢谢,

贾斯汀


编辑:for循环中的错误。不是复制粘贴一个实际的循环

我认为问题是在这些例程中没有使用关键字,所以C编译器必须担心指针别名

编译此程序:

#include <stdlib.h>
#include <stdio.h>

void dbpa(double *b, double *a, const int n) {
    for (int i = 0; i < n; i++) b[i] += a[i] ;

    return;
}

void dbpa_restrict(double *restrict b, double *restrict a, const int n) {
    for (int i = 0; i < n; i++) b[i] += a[i] ;

    return;
}

int main(int argc, char **argv) {
    const int n=10000;
    double *a = malloc(n*sizeof(double));
    double *b = malloc(n*sizeof(double));

    for (int i=0; i<n; i++) {
        a[i] = 1;
        b[i] = 2;
    }

    dbpa(b, a, n);
    double error = 0.;
    for (int i=0; i<n; i++)
        error += (3 - b[i]);

    if (error < 0.1)
        printf("Success\n");

    dbpa_restrict(b, a, n);
    error = 0.;
    for (int i=0; i<n; i++)
        error += (4 - b[i]);

    if (error < 0.1)
        printf("Success\n");

    free(b);
    free(a);
    return 0;
}
告诉我们没有restrict关键字的
dbpa()
例程没有并行化,但是
dbpa\u restict()
例程没有并行化


实际上,对于这类东西,您最好只使用OpenMP(或TBB或ABB或…),而不是试图说服编译器为您自动并行;可能更好的方法是只使用现有的线性代数包,不管是密集的还是稀疏的,这取决于您正在做什么

我认为问题在于这些例程中没有使用关键字,因此C编译器必须担心指针别名

编译此程序:

#include <stdlib.h>
#include <stdio.h>

void dbpa(double *b, double *a, const int n) {
    for (int i = 0; i < n; i++) b[i] += a[i] ;

    return;
}

void dbpa_restrict(double *restrict b, double *restrict a, const int n) {
    for (int i = 0; i < n; i++) b[i] += a[i] ;

    return;
}

int main(int argc, char **argv) {
    const int n=10000;
    double *a = malloc(n*sizeof(double));
    double *b = malloc(n*sizeof(double));

    for (int i=0; i<n; i++) {
        a[i] = 1;
        b[i] = 2;
    }

    dbpa(b, a, n);
    double error = 0.;
    for (int i=0; i<n; i++)
        error += (3 - b[i]);

    if (error < 0.1)
        printf("Success\n");

    dbpa_restrict(b, a, n);
    error = 0.;
    for (int i=0; i<n; i++)
        error += (4 - b[i]);

    if (error < 0.1)
        printf("Success\n");

    free(b);
    free(a);
    return 0;
}
告诉我们没有restrict关键字的
dbpa()
例程没有并行化,但是
dbpa\u restict()
例程没有并行化


实际上,对于这类东西,您最好只使用OpenMP(或TBB或ABB或…),而不是试图说服编译器为您自动并行;可能更好的方法是只使用现有的线性代数包,不管是密集的还是稀疏的,这取决于您正在做什么

很抱歉,这不是我的实际循环,只是试图显示一个示例并弄乱了格式。很抱歉,这不是我的实际循环,只是试图显示一个示例并弄乱了格式。Jonathan,谢谢你的评论。我可以试用OpenMP(对C++编程来说还是新的)。我会使用现有的线性代数软件包,但不幸的是,这不是我的决定。我也将使用restrict和OpenMP进行查看。谢谢你,乔纳森,谢谢你的评论。我可以试用OpenMP(对C++编程来说还是新的)。我会使用现有的线性代数软件包,但不幸的是,这不是我的决定。我也将使用restrict和OpenMP进行查看。非常感谢。