gpt4 book ai didi

c - 如何尽可能快地输出固定缓冲区?

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:09 24 4
gpt4 key购买 nike

示例代码:

#include <stdio.h>
#include <unistd.h>
#include <sched.h>
#include <pthread.h>

int
main (int argc, char **argv)
{

unsigned char buffer[128];
char buf[0x4000];
setvbuf (stdout, buf, _IOFBF, 0x4000);
fork ();
fork ();

pthread_t this_thread = pthread_self ();

struct sched_param params;

params.sched_priority = sched_get_priority_max (SCHED_RR);

pthread_setschedparam (this_thread, SCHED_RR, &params);


while (1)
{
fwrite (&buffer, 128, 1, stdout);
}
}

该程序打开 4 个线程并在 stdout 上输出“缓冲区”的内容,在 64 位 cpu 上为 128 字节或 16 长整数。

如果我然后运行:

./writetest | pv -ptebaSs 800G >/dev/null

我得到的速度约为 7.5 GB/秒。

顺便说一句,这与我这样做时获得的速度相同:

$ mkfifo out
$ dd if=/dev/zero bs=16384 >out &
$ dd if=/dev/zero bs=16384 >out &
$ dd if=/dev/zero bs=16384 >out &
$ dd if=/dev/zero bs=16384 >out &
pv <out -ptebaSs 800G >/dev/null

有没有办法让它更快?笔记。实际程序中的缓冲区不是用零填充的。

我的好奇心是了解单个程序(多线程或多进程)可以输出多少数据

看起来有 4 个人没有理解这个简单的问题。我什至把问题的原因加粗了。

最佳答案

看来 linux 调度程序和 IO 优先级在减速中起了很大的作用。

此外,幽灵和其他 cpu 漏洞缓解措施开始发挥作用。

经过进一步优化,为了达到更快的速度,我不得不调整这个东西:

1) program nice level (nice -n -20)
2) program ionice level (ionice -c 1 -n 7)
3) pipe size increased 8 times.
4) disable cpu mitigations by adding "pti=off spectre_v2=off l1tf=off" in kernel command line
5) tuning the linux scheduler

echo -n -1 >/proc/sys/kernel/sched_rt_runtime_us
echo -n -1 >/proc/sys/kernel/sched_rt_period_us
echo -n -1 >/proc/sys/kernel/sched_rr_timeslice_ms
echo -n 0 >/proc/sys/kernel/sched_tunable_scaling

现在程序输出(在同一台电脑上)8.00 GB/秒!

如果您有其他想法,欢迎贡献。

关于c - 如何尽可能快地输出固定缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com