【问题标题】:Real parallelism in Linux shellLinux shell 中的真正并行性
【发布时间】:2016-06-29 15:12:35
【问题描述】:

我正在尝试在 Linux shell 上实现真正的并行性,但我无法实现。

我有两个程序。 Allones,只打印 '1' 字符和 allzeros,只打印 0 个字符。

当我执行“./allones & ./allzeros &”时,我得到大量的 '0' 和大量的 '1',它们混合成大块(例如 1111...111000...0000111. ..111000...000")。我的处理器有 8 个内核。

但是,当我在多核 FPGA(没有操作系统)上执行我自己的程序时,(如果我在不同的内核上分发程序)我会得到类似“011000101000011010...”的信息。

如何在 Linux 上运行它以获得类似于在多核 FPGA 上获得的结果?

【问题讨论】:

  • 也许stdbuf -o0 /allones & stdbuf -o0 /allzeros & 会有所帮助。请注意,并非所有系统都有stdbuf,因此如果不可用,请检查unbuffer。此外,由于我们没有您的程序可供测试,您可能只需要第一个 stdbuf。或者您可以包含您的代码,并为您的 Q 标记该语言。您的语言中可能还有其他功能。避免缓冲输出(这几乎可以肯定是你的问题)。祝你好运。
  • @shellter:我的程序与下面那个人(即 spam.c)提出的程序非常相似。
  • 我也试过 stdbuf -o0 ,这也解决了这个问题。因此,我可以在我的程序中使用 stdbuf -o0 或使用 fflush(stdout) 。这很有趣,因为在我的 FPGA 上的“轻型实时操作系统”上,我没有体验到这种缓冲效果。

标签: linux shell parallel-processing


【解决方案1】:

听起来您正在体验 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(...) P>

在我的系统上,每个块的长度正好是 1024 字节,强烈暗示存在缓冲问题。

这是带有fflush 以防止缓冲的相同代码:

#include <stdio.h>    
int main(int argc, char** argv) {
  while(1) {
    printf("%s", argv[1]);
    fflush(stdout);
  }
}

这是新的输出:

1001100110011001100110011C11001100110011001100110011001100>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多