我是新来的,这是我在本网站上的第一个问题;

我正在做一个简单的程序来查找 vector c的最大值,该 vector 是其他两个 vector a和b的函数。我正在Microsoft Visual Studio 2013上执行此操作,问题是它仅支持OpenMP 2.0,并且我无法执行还原操作来直接找到 vector 的最大值或最小值,因为OpenMP 2.0不支持此操作。
我正在尝试使用以下代码在不减少构造函数的情况下进行操作:

for (i = 0; i < NUM_THREADS; i++){
    cMaxParcial[i] = - FLT_MAX;
}

omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for private (i,j,indice)
for (i = 0; i < N; i++){
    for (j = 0; j < N; j++){
        indice = omp_get_thread_num();

        if (c[i*N + j] > cMaxParcial[indice]){
            cMaxParcial[indice] = c[i*N + j];
            bMaxParcial[indice] = b[j];
            aMaxParcial[indice] = a[i];
        }
    }
}
cMax = -FLT_MAX;

for (i = 0; i < NUM_THREADS; i++){
    if (cMaxParcial[i]>cMax){
        cMax = cMaxParcial[i];
        bMax = bMaxParcial[i];
        aMax = aMaxParcial[i];
    }

}

我收到错误消息:“表达式必须具有整数或无作用域的枚举类型”
在命令cMaxParcial[indice] = c[i*N + j];

有人可以帮我解决这个错误吗?

最佳答案

通常,错误是由索引之一不是整数类型引起的。由于您尚未显示声明ijNindice的代码,因此我猜测Nindice是float或double,但是如果提供了MCVE,则回答起来会更简单。但是,它上面的行似乎正确使用了相同的索引。这使我相信这是一个IntelliSense错误,通常是误报。尝试编译代码并运行它。

现在,讨论尚未(尚未)问到的问题(为什么并行代码比串行代码慢?)。您正在通过使用(大概)连续数组查找每个线程的a,b和c值来导致false sharing。不要像pragmaparallel那样使用单个for,而是像这样将其拆分:

cMax = -FLT_MAX;

#pragma omp parallel
{
    float aMaxParcialPerThread;
    float bMaxParcialPerThread;
    float cMaxParcialPerThread;

    #pragma omp for nowait private (i,j)
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            if (c[i*N + j] > cMaxParcialPerThread){
                cMaxParcialPerThread = c[i*N + j];
                bMaxParcialPerThread = b[j];
                aMaxParcialPerThread = a[i];
            } // if
        } // for j
    } // for i
    #pragma omp critical
        {
            if (cMaxParcialPerThread < cMax) {
                cMax = cMaxParcialPerThread;
                bMax = bMaxParcialPerThread;
                aMax = aMaxParcialPerThread;
            }
        }
}

关于c++ - 最大缩减Open MP 2.0 Visual Studio 2013 C/C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32215205/

10-09 17:46
查看更多