크기가 5000x1024 인 두 행렬을 곱하는 데 문제가 있습니다. 나는 전통적인 방식으로 루프를 통해 그것을 시도했지만, 그것은 영원히 걸립니다. 구현되고 최적화 된 행렬 연산 또는 3 개의 루프없이 수행하는 알고리즘이있는 좋은 라이브러리가 있습니까?C#의 행렬 곱셈
답변
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 커널을 빌드 할 수 있습니다. 확실히 학습 곡선을 낮 춥니 다.
나는 [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
이 cloo : http://opencloovision.codeplex.com/을 의미 했습니까? – surfmuggle
실행 시간이 약 Strassen algorithm입니다. O (n 2.8) 대신에 O (n)를 곱하면됩니다. 한 가지 문제는 항상 안정적인 것은 아니지만 매우 높은 차원에서 잘 작동한다는 것입니다. 게다가 그것은 정말 복잡해서 디자인을 재고하고 매트릭스의 크기를 줄이거 나 문제를 작은 조각으로 나눌 것을 제안합니다.
그러나 특별한 특성이없는 행렬 곱셈 (예 : Aidan)은 최적화하기가 거의 불가능하다는 것을 명심하십시오. 예 : Coppersmith-Winograd algorithm은 O (n 2.3737)를 사용하며, 행렬 곱셈을위한 최상의 알고리즘 중 하나입니다! 여기서 가장 좋은 옵션은 OpenCL과 GPU (David으로 언급)를 사용하거나 numpy
패키지로 Python과 같은 다른 최적화 된 프로그래밍 언어를 살펴 보는 것입니다.
행운을 비네드립니다!
신경망을위한 PCA 감소를 위해 그것을 사용하고 있습니다. 그래서 나는 모든 지식을 하나의 행렬에 넣고 그것과 함께 계산해야만한다. –
- 1. OpenGL은 행렬 곱셈
- 2. 행렬 곱셈
- 3. 행렬 곱셈
- 4. 행렬 - 행렬 곱셈/행렬 - 벡터 곱셈 알고리즘의 다른 유형은 무엇입니까
- 5. 자바 행렬 곱셈 (FAST)
- 6. 삼각형 곱셈 행렬 생성
- 7. GSL-GNU의 행렬 곱셈
- 8. 파이썬에서의 벡터 행렬 곱셈?
- 9. MATLAB 행렬 곱셈
- 10. 병렬 행렬 곱셈
- 11. 행렬 곱셈 CUDA
- 12. OpenMPI 행렬 곱셈
- 13. CUBLAS 행렬 곱셈
- 14. hlsl 행렬 곱셈
- 15. C에서 5x5 행렬 곱셈
- 16. 쉐이더 곱셈 행렬
- 17. 쌍을 사용하는 행렬 곱셈
- 18. Vector3 행렬 곱셈
- 19. 암호화를위한 행렬 곱셈 역함수
- 20. 행렬 곱셈 (MTL 4)
- 21. 프롤로그에서 행렬 곱셈
- 22. 행렬 및 벡터 곱셈
- 23. 행렬 타입에 의한 변환 행렬 곱셈
- 24. 자바 6의 병렬 행렬 곱셈
- 25. R의 이상한 결과의 행렬 곱셈
- 26. C - 행렬 곱셈 세분화 오류
- 27. 1d 배열을 사용하는 행렬 곱셈
- 28. 행렬 곱셈 : Strassen vs. Standard
- 29. 파이썬 numpy memmap 행렬 곱셈
- 30. 벡터를 이용한 행렬 곱셈 - C++
C#이 아니지만 알고리즘상의 문제입니다. 예, Strassen의 알고리즘을 사용하더라도 그러한 크기의 행렬 곱셈에 약간의 시간이 걸릴 것입니다. –
나는 C# 문제가 아니라는 것을 알고있다. 사람들이 내가 어떤 언어로 작업 하는지를 알 수 있도록 그것을 참조했다. –
btw ... Atranspose * A를 곱한 다음 모든 수를 열 수로 나누기. –