大量 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_THREAD
和SC_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
在具有许多 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_THREAD
和SC_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