【问题标题】:C++ - MultithreadingC++ - 多线程
【发布时间】:2014-03-13 20:05:23
【问题描述】:

我有代码:

for (int i = 0; i < (int)(kpts.size()); i++) {
    perform_operation(kpts1[i], *kpts2[i]);
}

其中kpt1kpt2std::vector&lt;&gt; 类型。函数perform_operation接受kpt1[i],对其执行操作并将其存储在kpt2[i]中。

看来我应该能够多线程。由于 for 循环的每个循环都是相互独立的,那么我应该能够以与 CPU 内核一样多的进程并行运行,对吧?

我似乎有几个这样的问题有点在回答这个问题,但他们并没有真正了解如何并行化一个简单的 for 循环;而且我不确定是否可以读取相同的kpt1 变量并写入相同的kpt2 变量。

还是我误解了什么? - 这不是可并行化的吗?

如果我能在 C++C 中找到解决方案,我会很高兴,但现在我被困住了。

【问题讨论】:

  • 是的,您可以简单地将其并行化,但请事先考虑一下——您当然不想要数千个线程,但只要您拥有物理内核即可。所以你真的只想对索引空间进行分区。
  • C++11 支持标准库中的线程。如果kpts.size() 很大和/或perform_operation() 非常昂贵,那么它可能值得并行化。
  • @KerrekSB 我肯定会对kpts1 进行分区,以便最大线程数等于内核数(我仍在决定我将使用哪个 AWS 实例,所以我不知道最大内核数在这一刻)。但是为了争论,假设我想把它分成8 进程。我怎么能这样做?

标签: c++ c multithreading


【解决方案1】:

如果每个perform_operation 相互独立运行,那么 ues,这是可并行化的。

与其简单地调用 perform_operation,不如启动一个新线程(使用pthread_create)。您需要将参数包装在单个 struct 中(可能只是指向两个参数的指针),并将 start_routine 作为 perform_operation 的包装器传递。这将创建相关数量的线程。然后在第二个for 循环中使用pthread_join 等待您创建的线程退出。

这是一个粗略的轮廓。显然,一些错误处理会很有用,您可能希望每个线程连续执行多个perform_operations,而不是每个项目一个线程。但是你应该从上面得到基本的想法。

【讨论】:

  • 感谢@abligh 的回答。这看起来是个好方法;但这正是我找不到任何基本代码的示例类型。我对C/C++ 线程非常陌生,所以我希望尽可能遵循一些基本代码。
  • 如果你能找到 C++ 库,那可能会更容易。如果使用 pthreads,试试这个:computing.llnl.gov/tutorials/pthreads/#Joining - 也看看stackoverflow.com/questions/15376908/…
  • @Brett 请注意,在当今时代,您不必直接使用pthreads。 C++11有一个线程库,如果你没有C++11,那就有boost.thread
【解决方案2】:

我相信你问的是你能在一个单独的线程中对数组的每个元素进行操作吗?

你可以。不过有几个考虑因素。

只要单独的操作不会相互影响,它就是一个很好的并行候选者。

实际上,CPU 线程的标准设置速度很慢,并且会占用大量内存(默认情况下,pthread 为每个线程分配 32 兆字节的堆栈)。如果任务非常密集,那么您可以节省时间来恢复设置开销。如果不是,那么它比直接编写代码更难、更大、更慢。

Intel TBB 是一种选择。 NVidia CUDA 是另一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多