我有一个顺序用户空间程序(某种内存密集型搜索数据结构).以CPU周期数量来衡量的程序性能取决于底层数据结构的内存布局和数据高速缓存大小(LLC). 到目前为止,我的用户空间程序被调
到目前为止,我的用户空间程序被调整为死亡,现在我想知道我是否可以通过将用户空间代码移动到内核(作为内核模块)来获得性能提升.我可以想到以下因素可以改善内核空间的性能……
>无系统调用开销(每次系统调用获得多少CPU周期).这不太重要,因为我几乎没有在我的程序中使用任何系统调用,除了在程序启动时分配内存.
>控制调度,我可以创建一个内核线程,使其在给定的核心上运行而不会被丢弃.
>我可以使用kmalloc内存分配,因此可以更好地控制分配的内存,也可以通过控制分配的内存来更精确地控制缓存着色.值得一试吗?
我向内核专家提出的问题……
>我是否错过了上述列表中可以进一步提高性能的任何因素?
>值得尝试还是直截了当地知道我不会得到太多的性能提升?
>如果在内核中可以获得性能增益,那么估计可以获得多少增益(任何理论猜测)?
谢谢.
关于第1点:内核线程仍然可以被抢占,所以除非你正在制作大量的系统调用(你不是这样),否则这不会给你带来太大的影响.关于第2点:您可以通过在Linux上使用sched_setaffinity()
设置其关联性来将线程固定到特定核心.
关于第3点:你期待什么额外的控制?您已经可以使用mmap()从用户空间分配页面对齐的内存.这已经允许您控制缓存的集合关联性,并且您可以使用内联汇编或编译器内在函数来进行任何手动预取提示或非时间写入.内核和用户空间中分配的内存之间的主要区别在于kmalloc()分配有线(不可分页)内存.我不明白这会有什么帮助.
我怀疑在使用SIMD,多线程或进行进一步算法或内存优化的并行化方面,你会看到更好的ROI.