c++ - seastar 如何在不同的 cpu 上调用代码?

标签 c++ performance c++11 smp

我目前正在使用 seastart 框架,
并发现它声称 seastart 可以将任务提交到不同的 cpu。

Seastar 声称它在不同的 coers 之间没有任何共享。

enter image description here

所以我认为seastar将不同的线程绑定(bind)到不同的cpu,
并将不同的任务提交到不同的后台线程(称为引擎、容器或其他东西)。

seastar 如何实现这一点,使用 pthread_setaffinity_np ?

但是在提交任务之前,代码仍然在随机线程上工作吗?通过使用 smp::submit_to 编码将网络套接字或存储等关键资源分配到不同的 cpu明确地?

最佳答案

直到现在我才听说过 Seastar,而且这张照片看起来非常低效。正如 benchmarks 所证实的那样.每个线程有一个堆栈会更有效,因为堆栈的顶部总是“热”的(缓存在 L1 中)。

无论如何,是的,要将线程固定到核心,您可以使用特定于平台的 API。如果是 POSIX,则为 pthread_setaffinity_np :

cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core, &cpuset); // core number starts from 0
int rc = pthread_setaffinity_np(myThread.native_handle(), (cpu_set_t), &cpuset);

SetThreadAffinityMask 在 Windows 上:
DWORD_PTR mask = (DWORD_PTR) (1 << core); // core number starts from 0
auto rc = SetThreadAffinityMask(GetCurrentThread(), mask);

关于c++ - seastar 如何在不同的 cpu 上调用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59659862/

相关文章:

c++ - 无法在 OpenGL 上加载多个纹理

c++ - 为什么这个float类型的值会这样输出呢?

c++ - 椭圆的线宽不是常数

c++ - 错误 C2668 : 'boost::bind' : ambiguous call to overloaded function

c++ - C++ 混淆中的引用

algorithm - 跟踪电影和搜索频率的高效程序?

c - fputwc 和 fgetwc 是否比 fprintf 和 fscanf 快得多?为什么会这样?

c++ - 重新初始化 vector 的最快方法是什么?

c++ - 防止参数包扩展中的数组衰减

c++ - 如果 std::call_once 已执行,获取状态吗?