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