2012-06-22 9 views
2

크기가 5000x1024 인 두 행렬을 곱하는 데 문제가 있습니다. 나는 전통적인 방식으로 루프를 통해 그것을 시도했지만, 그것은 영원히 걸립니다. 구현되고 최적화 된 행렬 연산 또는 3 개의 루프없이 수행하는 알고리즘이있는 좋은 라이브러리가 있습니까?C#의 행렬 곱셈

+0

C#이 아니지만 알고리즘상의 문제입니다. 예, Strassen의 알고리즘을 사용하더라도 그러한 크기의 행렬 곱셈에 약간의 시간이 걸릴 것입니다. –

+0

나는 C# 문제가 아니라는 것을 알고있다. 사람들이 내가 어떤 언어로 작업 하는지를 알 수 있도록 그것을 참조했다. –

+0

btw ... Atranspose * A를 곱한 다음 모든 수를 열 수로 나누기. –

답변

4

OpenCL을 사용해 보셨습니까? Cloo (C# OpenCL 라이브러리) 배포판의 예제 중 하나는 큰 2D 행렬 곱셈입니다.

CUDA와 달리 OpenCL 커널은 GPU (사용 가능하고 지원되는 경우) 또는 CPU에서 실행됩니다. GPU에서 정말, 정말, 정말 빠른 속도 증가를 볼 수 있습니다. 내 말은, 은 실제로의 극적이며, 커널의 효율성과 GPU의 코어 수에 따라 10 배에서 100 배입니다. (Fermi 기반 NVidia 카드는 384-512 사이에 있고, 새로운 600은 1500과 같은 것입니다.)

수치 적으로 집중적이고 쉽게 병렬화 가능한 작업을 수행하는 사람이라면 또한

Parallel.For(
    0 
    ,5000 
    , (i) => { 
    for(var j=0;j<1024;j++) 
    { 
     result[i,j] = ..... 
    } 
); 

을 GPU.NET와 브라흐마을 체크 아웃 : -이 GPU를 사용한다처럼 병렬화 내장 최소한 C#을 's을 (를) 사용하고 있는지를 확인하십시오. Brahma를 사용하면 LINQ를 사용하여 C#에서 OpenCL 커널을 빌드 할 수 있습니다. 확실히 학습 곡선을 낮 춥니 다.

+0

나는 [Brahma on codeplex] (http://brahma.codeplex.com/)와 [Brahma (alpha) on sourceforge]를 발견했다. (http://sourceforge.net/projects/brahma-fx /) - 둘 다 버려진 것처럼 보입니다. [Gpu.Net on Github] (https://github.com/tidepowerd/GPU.NET-Example-Projects)도 마찬가지입니다. 회사 웹 사이트 http://www.tidepowerd.com은 더 이상 온라인 상태가 아닙니다. – surfmuggle

+0

이 cloo : http://opencloovision.codeplex.com/을 의미 했습니까? – surfmuggle

3

실행 시간이 약 Strassen algorithm입니다. O (n 2.8) 대신에 O (n)를 곱하면됩니다. 한 가지 문제는 항상 안정적인 것은 아니지만 매우 높은 차원에서 잘 작동한다는 것입니다. 게다가 그것은 정말 복잡해서 디자인을 재고하고 매트릭스의 크기를 줄이거 나 문제를 작은 조각으로 나눌 것을 제안합니다.

그러나 특별한 특성이없는 행렬 곱셈 (예 : Aidan)은 최적화하기가 거의 불가능하다는 것을 명심하십시오. 예 : Coppersmith-Winograd algorithm은 O (n 2.3737)를 사용하며, 행렬 곱셈을위한 최상의 알고리즘 중 하나입니다! 여기서 가장 좋은 옵션은 OpenCL과 GPU (David으로 언급)를 사용하거나 numpy 패키지로 Python과 같은 다른 최적화 된 프로그래밍 언어를 살펴 보는 것입니다.

행운을 비네드립니다!

+0

신경망을위한 PCA 감소를 위해 그것을 사용하고 있습니다. 그래서 나는 모든 지식을 하나의 행렬에 넣고 그것과 함께 계산해야만한다. –