我有一个程序可以读取大约 1000 张图像并创建其内容的统计摘要。每个图像都使用 OpenMP 在其自己的线程中处理,并且我将线程限制设置为与我的处理器数量相匹配。
直到大约两周前,该程序运行良好。但是,现在,如果我多次运行该程序,我的系统就会变慢并最终死机。
为了排除故障,我编写了下面列出的简单代码来模拟我的程序正在做什么。在尝试仅读取第 35 行的几个文件之后,此代码将冻结我的系统,就像我的原始程序一样。
我运行该程序,在每次失败后相继恢复到较早的内核,发现它在所有 3.6 内核到版本 3.6.8 时都失败了。
但是,当我回到内核 3.5.6 时,它可以工作。
测试.cc:
1 #include <cstdio>
2 #include <iostream>
3 #include <vector>
4 #include <unistd.h>
5
6 using namespace std;
7
8 int main ()
9 {
10 // number of files
11 const size_t N = 1000;
12 // total system memory
13 const size_t MEM = sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGE_SIZE);
14 // file size
15 const size_t SZ = MEM/N;
16
17 // create temp filenames
18 vector<string> fn (N);
19 for (size_t i = 0; i < fn.size (); ++i)
20 fn[i] = string (tmpnam (NULL));
21
22 // write a bunch of files to disk
23 for (size_t i = 0; i < fn.size (); ++i)
24 {
25 vector<char> a (SZ);
26 FILE *fp = fopen (fn[i].c_str (), "wb");
27 fwrite (&a[0], a.size (), 1, fp);
28 clog << fn[i] << " written" << endl;
29 }
30
31 // read a bunch of files from disk
32 #pragma omp parallel for
33 for (size_t i = 0; i < fn.size (); ++i)
34 {
35 vector<char> a (SZ);
36 FILE *fp = fopen (fn[i].c_str (), "rb");
37 fread (&a[0], a.size (), 1, fp);
38 clog << fn[i] << " read" << endl;
39 }
40
41 return 0;
42 }
生成文件:
1 a:$
2 g++ -fopenmp -Wall -o test -g test.cc$
3 ./test$
我的问题是:内核 3.6 有什么不同会导致该程序失败,但不会导致它在 3.5 版中失败?