我是新来的,这是我在本网站上的第一个问题;
我正在做一个简单的程序来查找 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];
上有人可以帮我解决这个错误吗?
最佳答案
通常,错误是由索引之一不是整数类型引起的。由于您尚未显示声明i
,j
,N
和indice
的代码,因此我猜测N
或indice
是float或double,但是如果提供了MCVE,则回答起来会更简单。但是,它上面的行似乎正确使用了相同的索引。这使我相信这是一个IntelliSense错误,通常是误报。尝试编译代码并运行它。
现在,讨论尚未(尚未)问到的问题(为什么并行代码比串行代码慢?)。您正在通过使用(大概)连续数组查找每个线程的a,b和c值来导致false sharing。不要像pragma
和parallel
那样使用单个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/