문제

온라인으로 매트릭스 곱셈/반전 벤치 마크를 찾으려고 노력하고 있습니다. 내 C ++ 구현은 현재 38 초 안에 100 x 100 매트릭스를 뒤집을 수 있지만 이것 내가 찾은 벤치 마크, 내 구현의 성능은 정말 빨라집니다. 나는 그것이 슈퍼 최적화 된 무언가인지 또는 실제로 약 0.11 초 안에 200 x 200 매트릭스를 쉽게 반전시킬 수 있는지 모르겠으므로 결과를 비교하기위한 더 많은 벤치 마크를 찾고 있습니다. 당신은 좋은 링크가 있습니까?

업데이트곱셈 코드에서 버그를 발견하여 결과에 영향을 미치지 않았지만 쓸모없는 사이클 폐기물을 유발했습니다. 이제 내 반전은 20 초 안에 실행됩니다. 여전히 많은 시간이 지났으며 어떤 아이디어도 환영합니다.

여러분 감사합니다

도움이 되었습니까?

해결책

이러한 종류의 작동은 매우 캐시에 민감합니다. L1 & L2 캐시에있는 변수에 대해 대부분의 작업을 수행하고 싶습니다. 이 문서의 섹션 6을 확인하십시오.

http://people.redhat.com/drepper/cpumemory.pdf

그는 캐시 최적화 된 방식으로 매트릭스를 곱하는 최적화를 안내하고 큰 개선을 가져옵니다.

다른 팁

값으로 거대한 매트릭스 객체를 전달하는지 확인하십시오 (전체 매트릭스를 복사하는 경우 비용이 많이들 수 있습니다).
참조별로 패스 할 수있는 경우.

Matricies와 C ++에 대한 것은 가능한 한 많이 복사하지 않기를 원합니다.
따라서 주 객체는 아마도 "매트릭스 데이터"를 콘테인하지 말고 행렬에 대한 메타 데이터와 데이터 부분에 대한 포인터 (Somthing Smart에 의해 포장)를 포함해야합니다. 따라서 객체를 복사 할 때는 전체가 아닌 작은 데이터 덩어리 만 복사합니다 (예를 들어 문자열 구현 참조).

처음에 자신의 매트릭스 라이브러리를 구현 해야하는 이유는 무엇입니까? 이미 발견 한 바와 같이 이미 동일한 작업을 수행 할 수있는 매우 효율적인 라이브러리가 이미 있습니다. 그리고 사람들이 C ++를 성능 언어로 생각하는만큼 진짜 언어에 능숙합니다. C ++로 매우 느린 코드를 작성하는 것은 매우 쉽습니다.

나는 그것이 슈퍼 최적화 된 무언가인지 또는 실제로 약 0.11 초 안에 200 x 200 행렬을 쉽게 반전시킬 수 있는지 모르겠습니다.

Matlab은 땀을 흘리지 않고 그렇게합니다. 당신은 그것을 구현하고 있습니까? 라크 매트릭스 역전에 대한 루틴 (예 : LU 분해)?

프로파일 링을 시도해 보셨습니까?

이후 종이 (PDF), LU 분해가있는 100x100 행렬의 계산은 1348250 (부동 소수점 조작)이 필요합니다. 코어 2는 약 20 개의 gflops를 할 수 있습니다 (프로세서 메트릭). 따라서 이론적으로 말하면 1ms 안에 반전을 할 수 있습니다.

코드가 없으면 큰 차이의 원인이 무엇인지 주장하기가 매우 어렵습니다. 루프 Unrolling, 캐싱 값, 참조, 스레딩 등과 같은 마이크로 최적화를 시도한 경험에 따르면 속도가 높아질 수 있습니다.

그러나 크기의 속도 증가를 원한다면 알고리즘을 살펴 봐야합니다. 아마도 LU 분해 구현에는 버그가있을 수 있습니다. 살펴볼 또 다른 장소는 데이터 조직, 다른 조직을 시도하고 행/열 요소를 합치는 것입니다.

그만큼 Linpack 벤치 마크는 선형 대수 문제 해결을 기반으로합니다. 그들은 다른 기계에 사용할 수 있습니다 언어. 어쩌면 그들은 당신을 도울 수 있습니다.

Linpack C ++ 라이브러리 사용 가능 여기, 도.

나는 실제로 **를 사용하여 약 7 초를 얻었습니다.double** 대신 **long double** s, 그러나 나는 정밀도의 절반을 잃은 이후로 큰 것은 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top