. 주목해야 할
let myBigElemMultiply (m:matrix) (n:matrix) =
let AddTwoRows (row:int) (destination:matrix) (source1:matrix) (source2:matrix) =
for col=0 to destination.NumCols-1 do
let mutable sum = 0.0
for k=0 to m.NumCols-1 do
sum <- sum + source1.[row,k] * source2.[k,col]
destination.[row,col] <- sum
let result = Matrix.zero m.NumRows n.NumCols
let operations = [ for i=0 to m.NumRows-1 do yield async { AddTwoRows i result m n} ]
let parallelTasks = Async.Parallel operations
Async.RunSynchronously parallelTasks |> ignore
result
한 가지 m.[i,j]
는 매트릭스의 요소에의 액세스에 사용하는 비효율적 인 방법이기 때문에이 코드가 아주 나쁘게 수행 할 것입니다.
let myBigElemMultiply2 (m:matrix) (n:matrix) =
let AddTwoRows (row:int) (destination:matrix) (source1:matrix) (source2:matrix) =
let destination = destination.InternalDenseValues
let source1 = source1.InternalDenseValues
let source2 = source2.InternalDenseValues
for col=0 to Array2D.length2 destination - 1 do
let mutable sum = 0.0
for k=0 to Array2D.length1 source2 - 1 do
sum <- sum + source1.[row,k] * source2.[k,col]
destination.[row,col] <- sum
let result = Matrix.zero m.NumRows n.NumCols
let operations = [ for i=0 to m.NumRows-1 do yield async { AddTwoRows i result m n} ]
let parallelTasks = Async.Parallel operations
Async.RunSynchronously parallelTasks |> ignore
result
테스트 : 당신은 더 나은 차원 배열을 사용하십시오
let r = new Random()
let A = Matrix.init 280 10340 (fun i j -> r.NextDouble())
let B = A.Transpose
일부 타이밍 : ParallelFor를 사용하여
> myBigElemMultiply A B;;
Real: 00:00:22.111, CPU: 00:00:41.777, GC gen0: 0, gen1: 0, gen2: 0
val it : unit =()
> myBigElemMultiply2 A B;;
Real: 00:00:08.736, CPU: 00:00:15.303, GC gen0: 0, gen1: 0, gen2: 0
val it : unit =()
> A*B;;
Real: 00:00:13.635, CPU: 00:00:13.166, GC gen0: 0, gen1: 0, gen2: 0
val it : unit =()
>
확인 here, 비동기보다 더 나은 성능을 가져야한다.
FWIW, 2D 배열도 액세스하기에 비효율적입니다 ... –
OP는 실제로 요소 별 승산을 요구했습니다. 즉,. * 연산자가 수행하는 것이지, 내가 설명한 것으로 생각하는 행렬 - 행렬 곱셈이 아닙니다. –