该代码工作正常,但不使用openmp。我已经使用私人和共享,但它仍然在我的struct SinRes
定义的行上提供了SIGSEGV。为什么这个openmp给SIGSEGV?
#pragma omp parallel for private(row, dt1, dt1s, dtmp, dat1, atur) shared(turVec)
for(row=0; row<ndicts; ++row)
{
dt1 = kI(keys)[row];
dt1s = to_string(dj(dt1));
dtmp = dt1s.substr(0, 4) + "." + dt1s.substr(4, 2) + "." + dt1s.substr(6, 2);
dat1 = kK(data)[row];
dat1s = kK(dat1->k)[1];
atur = breakLogic(dat1s, mpar, dtmp);
///free(atur);
turVec.push_back(atur);
}
的错误消息是
(gdb) run 5 x5.csv
Starting program: /root/cwork/ompTur 5 x5.csv
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaacd000
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x2aaaac2e1700 (LWP 17500)]
[New Thread 0x2aaaac4e2700 (LWP 17501)]
[New Thread 0x2aaaac6e3700 (LWP 17502)]
[New Thread 0x2aaaad1e9700 (LWP 17503)]
[New Thread 0x2aaaad3ea700 (LWP 17504)]
[New Thread 0x2aaaad5eb700 (LWP 17505)]
[New Thread 0x2aaaad7ec700 (LWP 17506)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2aaaad7ec700 (LWP 17506)]
0x0000000000407a7a in sinRes::sinRes (this=0x2aaab401f430) at ompTur.cpp:33
33 struct sinRes {
(gdb)
我是新来的OpenMP。我是否需要使用其他任何结构,如critical
?
为SinRes的代码只是
struct sinRes {
double pnl, numTrds, firstVar;
string dt;
};
它看起来像你粉碎堆栈。 –
你的意思是超载吗?我已经将它设置为无限制并且正在监视内存使用情况。这似乎只是〜500MB。 –
我的意思是某些代码在某些局部变量的边界之外写入,因此在不应该改变的地方更改堆栈。 –