并行矩阵乘法

6

我使用parpseq编写了一个简单的矩阵乘法并行程序。

运行该程序后,没有任何火花被转换(SPARKS: 20(0转换,0修剪))。

我希望听到您对改进此程序的建议。

还有关于在Haskell中学习并行编程的方法。

import Data.List
import Control.Parallel

parHelp :: ( Num a ) => [ a ] -> [ a ] -> a 
parHelp [] [] = 0
parHelp ( x : xs ) ( y : ys ) = ret where 
ret = par a ( pseq b ( a + b ) ) where 
        a = x * y 
        b = parHelp xs ys

helpMult :: ( Num a ) => [ a ] -> [ [ a ] ] -> [ a ]
helpMult _ [] = [] 
helpMult x ( y : ys ) = ret where 
 ret =  par a ( pseq b  ( a : b ) ) where 
   a = sum . zipWith ( *) x $ y  
   b = helpMult x ys

mult :: ( Num a ) => [ [ a ] ] -> [ [ a ] ] -> [ [ a ] ]
mult [] _ = []  
mult ( x : xs ) ys = ret where 
 ret = par a ( pseq b  ( a : b ) ) where 
    a = helpMult x ys 
    b = mult xs ys

main = print $ mult [[1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4] ] ( transpose [[1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4] ])

2
OT。请尝试访问http://codereview.stackexchange.com。 - Fred Foo
3
一个列表的列表不是矩阵。我建议你学习并使用 Repa 进行这个目的。如果你想学习如何使用并行包,我鼓励你选择另一个应用领域并重新提问。 - Thomas M. DuBuisson
11
不同意关闭票;SO 上需要更多关于并行 Haskell 的内容。 - Dan Burton
@casperOne 正如我之前提到的,我正在学习并行编程。在Simon Peyton Jones和Satnam Singh的论文中提到,为了获得并行速度,需要转换火花,但我的火花都没有被转换,所以我在这里问了一下。显然,我的测试数据不够强大(正如nponeccop所提到的)来测试并行性。我将使用1000X1000矩阵进行测试,并公布结果。 - keep_learning
@keep_learning:让我更清楚一些,你是想优化这段代码还是不想?目前,以它当前的形式,是否输出了你期望的结果? - casperOne
显示剩余3条评论
1个回答

3

你是否尝试过非常大的矩阵(至少1000x1000)?可能计算时间太短,无法并行化处理。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Royi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接