大量 SC_THREAD 的 Accellera SystemC 错误

Accellera SystemC error with a large number of SC_THREAD

在具有许多 SC_THREAD 个进程(> 32000)的 SystemC 模拟环境中,我在 Intel X86 平台上执行 Accellera 2.3.1 时遇到以下错误 运行 Ubuntu 15.04:

sc_cor_qt.cpp:114: virtual void sc_core::sc_cor_qt::stack_protect(bool) 
Assertion `ret == 0' failed

SystemC 内核的默认实现使用用户级线程(也称为协程)来实现 SystemC 进程。静态进程(SC_THREADSC_CTHREAD)在sc_simcontext.cpp行759初始化thread_p->prepare_for_simulation()这个函数将创建用户级线程对象,然后启用堆栈保护。

用户级线程的栈在SystemC模拟进程的堆中分配如下行cor->m_stack = new char[cor->m_stack_size]

我遇到的问题发生在创建后的堆栈保护函数中,它使用 mprotect 系统调用使页面紧跟在用户级线程的堆栈之后(同样,在Linux 进程的堆)根本无法访问 (PROT_NONE)。我从 mprotect 得到的错误 (ENOMEM) 说我们要保护的这个页面从未映射到内核无法分配的进程 一些内部结构,而 运行 mprotect 调用。不幸的是,我无法知道发生了这两个错误中的哪一个以及如何解决它。

此外,在进行 mprotect 调用之前,我看不到这个额外页面在 Linux 进程堆中的分配位置。

有谁知道发生了什么事and/or我能做些什么来进一步调试这个问题?

听起来你的大部分存储应该在堆上,但请尝试增加堆栈大小以防限制某些 SC 对象的分配。

检查当前堆栈大小:(来自 csh)

限制(或来自 sh: ulimit -a)

如果还没有无限,增加以下之一:

限制堆栈大小 1024m(来自 sh:ulimit -s 1024000)

limit stacksize unlimited(来自 sh:ulimit -s unlimited)

问题是单个进程允许的最大内存映射数。每个 mprotect 调用都会导致一个内存映射,导致映射总数大于系统的默认限制。要增加此限制,必须使用:

sudo sysctl vm/max_map_count=524240