gpt4 book ai didi

multithreading - 如何使用线程代替 perl/pdl 中的子例程循环

转载 作者:行者123 更新时间:2023-12-04 06:44:22 24 4
gpt4 key购买 nike

我有一个非常好的 Perl 子例程,作为 Perl 模块的一部分编写。在不涉及太多细节的情况下,它需要一个字符串和一个短列表作为参数(通常从终端获取)并吐出一个值(现在总是一个浮点,但情况可能并不总是如此。)

现在,我的参数的列表部分采用两个值,例如 (val1,val2)。我使用 for 循环将子例程的输出保存为 val1 和 val2 的数百个不同值。每次迭代几乎需要一秒钟才能完成 - 因此完成整个过程需要几个小时。

我最近读到了一种(对我来说)神秘的计算工具,称为“线程”,它显然可以以极快的执行时间取代 for 循环。我一直很难理解它们是什么和做什么,但我想它们与并行计算有关(并且我希望我的模块针对并行处理器尽可能优化。)

如果我将所有想要传递给 val1 的值保存为列表,例如@val1,对于 val2 也是如此,我如何使用这些“线程”来针对 val1 和 val1 的元素的每个组合执行我的子例程值2?此外,了解如何将此过程推广到也采用 val3、val4 等的子例程也会很有帮助。

最佳答案

更新:

我不使用 PDL,所以我不知道 PDL 中的线程与我一直在谈论的线程概念不完全对应。请参阅PDL threading and signatures :

First we have to explain what we mean by threading in the context of PDL, especially since the term threading already has a distinct meaning in computer science that only partly agrees with its usage within PDL.

但是,我认为下面的解释对您仍然有用,因为人们需要知道常规意义上的线程是什么才能理解 PDL 线程的不同之处。

这是Threads entry on Wikipedia作为背景。

使用线程并不能让你的程序神奇地变得更快。 如果您有多个 CPU/核心,并且如果您正在执行的计算可以分为独立的 block ,那么使用线程可以让您的程序在同一时间执行多个计算时间并减少总执行时间。

最简单的情况是子任务为embarrassingly parallel不需要线程之间的通信/协调。

关于可能的性能提升,请考虑以下计划:

#!/usr/bin/perl

use strict; use warnings;
use threads;

my ($n) = @ARGV;

my @threads = map { threads->create(\&act_busy) } 1 .. $n;

$_->join for @threads;

sub act_busy {
for (1 .. 10_000_000) {
my $x = 2 * 2;
}
}

在我运行 Windows XP 的双核笔记本电脑上:

C:\> timethis t.pl 1TimeThis :  Elapsed Time :  00:00:02.375
C:\> timethis t.pl 2TimeThis :  Elapsed Time :  00:00:02.515
C:\> timethis t.pl 3TimeThis :  Elapsed Time :  00:00:03.734
C:\> timethis t.pl 4TimeThis :  Elapsed Time :  00:00:04.703
...
C:\> timethis t.pl 10TimeThis :  Elapsed Time :  00:00:11.703

Now, compare that to:

#!/usr/bin/perl

use strict; use warnings;

my ($n) = @ARGV;

act_busy() for 1 .. $n;

sub act_busy {
for (1 .. 10_000_000) {
my $x = 2 * 2;
}
}
C:\> timethis s.pl 10TimeThis :  Elapsed Time :  00:00:22.312

关于multithreading - 如何使用线程代替 perl/pdl 中的子例程循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com