[英]C++ openMP array is sequential
我有2个数组,一个是int数组,另一个是double数组,我需要创建一个struct数组,在其中保存线程ID,int,来自数组的double值。 我有n个元素和n个线程。 我写了下面的代码,但是以某种方式它按顺序打印结果,结果没有混合,所以我真的不确定它是否可以并行工作。 码:
#include <iostream>
#include <omp.h>
using namespace std;
struct Data {
int threadNumber;
double doubleNumber;
int intNumber;
};
int main() {
int numbOfThreads = 20;
omp_set_num_threads(numbOfThreads);
double s2[50];
double s1[50];
Data allArray[50];
for (int i = 0; i < numbOfThreads; i++) {
s2[i] = i * 0.15;
s1[i] = i;
}
int threadNumber = 0;
#pragma omp parallel private(threadNumber)
{
threadNumber = omp_get_thread_num();
for (int i = threadNumber; i < 20; i++) {
allArray[i].threadNumber = threadNumber;
allArray[i].intNumber = s1[i];
allArray[i].doubleNumber = s2[i];
}
}
for (int i = 0; i < numbOfThreads; i++) {
cout << allArray[i].threadNumber << " " << allArray[i].intNumber << " " << allArray[i].doubleNumber << endl;
}
return 0;
}
和控制台结果:
0 0 0
1 1 0.15
2 2 0.3
1 3 0.45
1 4 0.6
1 5 0.75
6 6 0.9
7 7 1.05
8 8 1.2
9 9 1.35
10 10 1.5
11 11 1.65
12 12 1.8
13 13 1.95
14 14 2.1
15 15 2.25
16 16 2.4
17 17 2.55
18 18 2.7
19 19 2.85
线程ID值会更改,但是数据始终按升序排列。
看起来循环在代码的并行化部分之外。 循环依次浏览数据。 这就是这种情况下的期望。 您可以在threadNumber列中看到多线程的工件,但是此代码:
allArray[i].intNumber = s1[i];
allArray[i].doubleNumber = s2[i];
确保无论哪个线程正在将数据写入数组,这些值都将相同,因为这些值仅使用循环内(线程内)的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.