【问题标题】:Automatic Multithreading?自动多线程?
【发布时间】:2014-02-05 06:33:27
【问题描述】:

我正在编写一个如下所示的 C 程序:

for (int i=0;i<n;i++){
    [makes new file for i: i.txt]
    [runs a long and intensive computation]
    [writes to i.txt]
    [closes i.txt]}

其中 n 是一个很大的数字。显然,一次可以并行运行多个迭代,因为它们不相互依赖。我的处理器上有八个内核,所以我似乎希望我的程序将迭代分布在八个内核上,以便它尽可能快地运行。这意味着我希望程序是多线程的。

我的问题是我是否需要在 C 中手动多线程处理这个过程,或者多线程是否在某种程度上自动完成。我正在用 GCC 编译,我知道 GCC 优化得很好,但我不知道它是否会自动多线程。我也不知道我的操作系统(Debian Linux)是否不会自动将程序分发到我处理器的所有八个内核上。如果没有,有没有一种方法可以让它进入多线程,而不必在 C 中实际编写多线程代码?

【问题讨论】:

  • OpenMP 就是为这类东西而设计的。 #pragma omp parallel for 就是您需要说的所有内容,它基本上可以满足您的需求。
  • 你也可以尝试多处理
  • 另一个重要的问题是如何防止多个线程同时访问您的文件。
  • @ryyker 因为每次迭代只有一个文件,所以不应该有任何访问冲突。
  • @tmyklebu 您的评论实际上比任何答案都更有帮助。

标签: c multithreading optimization cpu


【解决方案1】:

如果需要,您可以手动对其进行多线程处理,或者您可以使用库和工具来承担您喜欢的责任或多或少。 OpenMP 绝对值得一看。

【讨论】:

    【解决方案2】:

    简单的答案是否定的:GCC 本身没有自动多线程。多线程是在严格高于 C 的层中定义的,所以 GCC 这样做会违反分层。

    话虽如此,有很多库可以让这项工作变得更容易(并不是说手动多线程处理您的特定情况需要大量工作),其中一些库在语言级别上集成得更紧密。 OpenMP 已被其他人提及。

    【讨论】:

      【解决方案3】:

      您还可以考虑在C11 standard 中添加有关多线程应用程序的新内容

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 2021-11-29
        • 2012-03-30
        相关资源
        最近更新 更多