我试图在linux shell上实现真正的并行性,但我无法实现。
我有两个节目。allones只打印“1”字符,allzero只打印0个字符。
当我执行“./allones&./allzeros&”时,我会得到“0”的大打印和“1”的大打印,它们混合在大的块中(例如1111….111000…0000111…111000…000”)。我的处理器有8核。
然而,当我在多核fpga(没有os)上执行自己的程序时(如果我在不同的核上分发程序),我得到类似“011000101000011010…”的结果。
如何在Linux上运行它,以获得类似于多核FPGA的结果?
最佳答案
听起来您正在体验libc的默认行缓冲:
下面是一个测试程序:
#include <stdio.h>
int main(int argc, char** argv) {
while(1) {
printf("%s", argv[1]);
}
}
我们可以使用:
$ ./spam 0 & ./spam 1 & sleep 1; killall spam
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111(…)000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(…)
在我的系统中,每个块正好有1024字节长,强烈暗示缓冲问题。
下面是用
spam.c
来防止缓冲的相同代码:#include <stdio.h>
int main(int argc, char** argv) {
while(1) {
printf("%s", argv[1]);
fflush(stdout);
}
}
这是新的输出:
100111001100110011001100110011001100110011001110011100111001101100110011001100110011001100110011001100110011001100110011001100011000110001100011000110011001100110011001100111111001101100110011001100110011001100110011000000000011001100011001011001