gpt4 book ai didi

c++ - 在 C++ 中读取 OpenMP 文件

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:28 25 4
gpt4 key购买 nike

我有一段代码逐行读取文件,然后将两个对应的二进制表示存储在两个 vector 中。但是 vector 的大小和处理的总行数为零。

    int numLines = 319426908; // calculated before for loop
char temp[100];
vector<long long int> p1, p2;
long long int c = 0;

#pragma omp parallel for schedule(dynamic) shared(c, p1, p2, fp) private(temp)
for(int i=0; i<numLines; i++){
if(fgets(temp, 100, fp) != NULL){
temp[strlen(temp)-1] = '\0';
long long int *A = toLongLong(temp);
p1.push_back(A[0]);
p2.push_back(A[1]);
c++;
}
}
cout << "Completed ...c = " << c << endl;
cout << "p1.size: " << p1.size() << " p2.size: " << p2.size() << endl;

这是输出

Completed ...c = 0
p1.size: 0 p2.size: 0

上面这段代码哪里出错了?

最佳答案

首先读取所有输入,然后对其进行并行处理。

我不确定 fgets() 是否线程安全,但是:

  • 如果是,那么并行化不会让您受益匪浅。这是因为需要阻塞来保证没有其他线程正在更新它(除非它使用非阻塞方法,但我相信这里不应该是这种情况)
  • 否则,您最终可能会多次读取相同的数据,甚至是损坏的数据。

您的另一个选择是拆分文件并处理它们。无论如何,如果文件不是太大,请尝试全部读取然后处理。如果它太大,请尝试加载一些记录(比如两千行)并行处理这些记录,重复。您可能需要进行一些测试,看看哪种方法更适合您。

~编辑:正如其他人所说,您可能也想检查对这些变量的并发访问。把它们放在一起,也许可以减少计算最终结果?看: C++ OpenMP Parallel For Loop - Alternatives to std::vector

关于c++ - 在 C++ 中读取 OpenMP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com