我刚刚开始学习Haskell,我的问题可能是一个琐碎的问题,所以很抱歉打扰你。
因此,假设我有一个真正的无限数据源(例如stdin),并且我想使用Repa或Accelerate的并行工具来处理数据。它们都使用数组(有限数据结构)。在我看来,我的代码将处理数组序列,但我真的不知道该怎么做,然后我需要从一个数组和下一个数组中获得一些数据来计算一些东西。
所以,我的意思是,如何计算所有输入的y = phase(a[i] * conj a[i+1]),其中a是无限的复数流。
发布于 2013-11-25 22:33:09
正如您提到的,Repa和Accelerate都是为处理固定大小的数组和矩阵而设计的。这些是面向批处理的算法,它们基于许多优化,这些优化只有在使用固定的内存位时才可用。
对于“无限”的数据,你需要一个流(或“在线”)算法。你所描述的方法是可流传输的,因为它只需要有限的窗口。您可以通过使用Repa为流进入的每一对输入(a[i], a[i+1])计算相位,将流算法转换为大量的小批量步骤,但由于将每个小块移动到连续的内存阵列所需的大量装箱和复制,您可能会失去速度。
相比较而言,您可以使用pipes之类的工具来生成快速流式处理算法。
import Pipes
import Data.Complex
type ComplexPair = (Complex Double, Complex Double)
pairOff :: Monad m => Pipe a (a, a) m r
pairOff = await >>= forever . go where
go x = await >>= \y -> yield (x, y)
compute :: Monad m => Pipe ComplexPair Double m r
compute = do
(ai, ai1) <- await
yield (phase $ ai * conjugate ai1)
run :: Monad m => Pipe (Complex Double) Double m r
run = pairOff >-> compute然后,run可以由无限的流输入源提供,并转储到处理管道的下一步中。这些源可以是一元的,如果是m ~ Identity的话,也可以是纯的。
发布于 2013-11-25 22:45:04
据我所知,你不能直接使用Repa或Accelerate来处理无限的数据流。它被设计成对向量进行操作,这是一种不同的数据结构。有一些方法可以解决这个问题,您可以选择以下几种方法:
pipes-concurrency包,您可以编写读取数据并并行处理数据的流处理器。你不会有向量的效率,但在使用最少内存的情况下更容易有效地处理无限的数据流。就我个人而言,我会从2.或3.开始,然后确定我的程序是否足够慢,足以保证使用向量。也许你可以从向量中获得额外的性能,但除非你使用的是GPU,否则这是不可能的。
https://stackoverflow.com/questions/20189512
复制相似问题