2010-07-24 2 views
6

저는 프로그램에서 여러 차례 입력해야하는 6 가지 방정식을 반복해서 풀어야합니다. 현재 Cramer의 시스템을 해결하는 방법을 사용하고 있으며, 꽤 잘 작동합니다. (내 프로세서가 실제로 연산을 추가하고 곱하는 것을 좋아하는 것으로 보이며 명시 적 방정식이 길이가 2 페이지 이상이더라도 1 마이크로 초의 솔루션을 얻습니다.) 그러나 내가 해결할 필요가있는 횟수는 엄청나고 더 빠른 방법을 찾고 있습니다.방정식의 선형 시스템을 해결합니다.

질문은 이러한 방정식을 풀기위한보다 빠르고 효율적인 방법이 있습니까? 아니면 CUDA와 같은 것이 여기에 도움이 될까요?

+0

6 개의 방정식이 모두 필요하다고 확신합니까? 방정식을 최대한 줄였습니까? – BoltBait

+0

안정성 문제를 해결하고 있는데, 6 DOF (3 직각 xyz 힘 및 3 xyz 토크)가 필요합니다. 방정식을 matlab에서 파생시키고 명시 적 솔루션을 프로그램에 하드 코딩했습니다 (결정은 별도로 해결됨).그러나, 나는 더 이상 실제 방정식을 단순화 할 수 없다. 그들은 너무 크고 다루기 힘들다. – Faken

+0

결정 요인을 어떻게 계산합니까? – sellibitze

답변

3

0을 줄 수 CUDA, 당신은 부동 또는 이중 정밀도 문제에 문제가있을 수 있습니다 시도는입니다.

사전 완성 해결 기능, http://arma.sourceforge.net/docs.html#solve을 제공합니다. 그러나 그것은 더 큰 기능을 위해 더 많이 조정되는 atlas/lapack backand를 사용합니다.

http://arma.sourceforge.net/docs.html#inv의 곱셈을 시도해 볼 수도 있습니다.이 템플릿은 컴파일 시간 템플릿이며 더 빠른 용도로 사용할 수 있습니다.

다음을 시도해보십시오. x = inv (A) * b. A는 변하지 않으므로 반전은 한 번만 수행됩니다. 그런 다음 간단한 매트릭스 벡터 곱셈을 사용하여 집에서 자유롭게됩니다. 실제로는 빠릅니다.

+0

@GMan이 제거했습니다. 다른 참고로, 나는 cublas/ubas bridge에서 일하고 있으며 파트너를 찾고 있습니다. 관심있는 사람 (또는 자신)을 알고 있습니까? 나는 당신이 쿠다를 사용하여 언급 한 어딘가를 본 것 같다고 생각합니다. – Anycorn

+0

@aaa : 부스터의 uBLAS (또는 다른 BLAS 라이브러리)가 CUBLAS를 이용할 수 있도록 허용합니까? 나는 그 자체로 흥미 롭다. 그러나 나는 다른 어떤 것을 할 시간이 없다. :(사실 CUDA를 사용했지만 주위를 돌릴 때까지는 아무 것도하지 않았습니다.) – GManNickG

+0

@Gman 확실히, 아무런 문제가 없습니다. 누군가를 알고 있을지도 모른다고 생각합니다. GPU에서는 ublas 표현을 사용하는 것과 같습니다. cublas 커널을 사용하는 메모리와 통신 할 몇 가지 함수 : 여기에 작은 테스트 케이스가 있습니다. http://code.google.com/p/asadchev/source/browse/trunk/projects/boost/numeric/bindings/cublas/test.cpp – Anycorn

2

을 확인할 수 있습니다.

그러나이 방법은 간단하지 않습니다. 당신은 LU decomposition을 조사하고 싶을 것이다.

+1

또는 LU 분해, 앞으로/뒤로 대체 (+1) – sellibitze

+0

과 같은 것들을 제공하는 다른 라이브러리로 만들었습니다. LU 분해가 컴퓨터 친화적 인 방법으로 문제를 해결합니까? 몇 년 전에 TI-83 계산기에서 알고리즘 알고리즘 중 하나를 프로그래밍했는데 숫자 방식의 수업에 심심한 태도를 보였습니다. 컴퓨터에서 우호적이지는 않지만 많은 부서를 사용했습니다. 다시 한번 살펴 보도록하겠습니다. 아마도 프로그램에 하드 코드로 몇 가지 일반적인 방정식을 도출 할 수있을 것입니다. – Faken

+0

@aaa : 내 방정식의 "형식"은 알려져 있고 변경되지 않습니다. 단지 값이 다릅니다 (Cramer의 규칙에 의해 사용할 수있는 형식으로 형성 될 때 행렬의 0과 1도 동일합니다). uBLAS는 그것을 고려하지 않을 것입니까? – Faken

0

SSE2 이상을 사용하면 두 배의 성능을 얻을 수 있습니다. 그러나 CUDA 또는 OpenCL 포트와 비교해 보면 그 정도면 약해질 것입니다. CUDA 또는 OpenCL 포트는 1-2 단계의 속도 향상을 가져올 수 있습니다.

파이썬을 알고 있다면 PyCUDA이 좋은 진입 점이 될 것입니다.

+0

현재 코어 i7 프로세서에서 VS2008을 사용하고 있는데 SSE2가 이미 기본적으로 활성화되어 있습니까? 그렇지 않은 경우 어떻게 활성화 할 수 있습니까? 또한 개념적으로 매우 높은 수준의 CUDA (계산할 값을 생성하는 하나의 스레드, CUDA에서 데이터로드 및 검색을 처리하는 스레드 및 결과 처리를위한 스레드)를 구현하는 가장 좋은 방법은 무엇입니까? 요법)? – Faken

+0

확실히. SSE2는 거의 10 년 전에 소개되었습니다. 코어 i7 아키텍처는 [SSE4.2] (http://en.wikipedia.org/wiki/SSE4)를 지원합니다. 나는 CUDA에서 당신을 도울 수 없다, 나는 두렵다, 나는 그걸 가지고 놀지 않았다. –

3

크레이머 규칙이 잘 확장되지 않습니다. 2 또는 3 개의 미지수가있는 방정식은 거의 없지만 시스템이 커지면 다른 방법이 더 효율적입니다 (예 : LU 분해 + 전달 대체 + 역방향 대체). 당신이 CUDA를 실행 싶다면

+0

예, 알고 있습니다 ... 방정식은 거대합니다. 나는 LU를 살펴볼 것이다. 귀하의 의견으로는 일반 라이브러리를 사용하여이를 해결해야합니까? 아니면 방정식 시스템의 형식에 대한 자세한 내용을 알고 있으므로 수학적 방법의보다 효율적인 방법을 찾으려고 노력해야합니다. – Faken

+1

시스템 Ab = y를 여러 번 확인하는 경우 LU가 작동합니다. 첫 번째 실행은 비싸고, 후속 실행은 빠릅니다. – joel3000

1

, 당신은 괜찮은 엔비디아 그래픽 카드가 필요

당신은 인텔 CPU가있는 경우, 당신은 인텔 CPU에 최적화 된 인텔 MKL http://software.intel.com/en-us/intel-mkl/을, 사용이 권유

당신이 사용하는 경우

게다가, 당신은 GPU 프로그래밍에 익숙하지 않은 경우, 당신은 거 인 CUDA 솔루션에 더 많은 시간을 보내고 아마도

+0

Aww ... $ 400+ yea, 내 운영 예산에서 나온 것. 어쩌면 대학에 면허가있어 집에서 일할 수 없다는 생각이 들었을 수도 있습니다. CUDA의 단점/이중 문제를 알고 있습니다. 현재는 속도 위반으로 인해 두 번 사용하고 있습니다. 그러나 Cramer의 규칙을 사용하면 부서가 없어 단일 지점에서 벗어날 수 있어야합니다. – Faken

+0

@Fake 실제로, 덧셈과 뺄셈은 에러의 주요 원인입니다. 곱셈과 나눗셈이 많지 않다. – Anycorn

+0

@shader : Heh, that dirty ... – Faken

0

방정식을 비 순차 순서로 풀 수있는 경우가 아니면 CUDA가 도움이되지 않습니다. 사실, CUDA가 더 느릴 수도 있습니다. 당혹스럽지 않게 병행하지 않는 것은 CUDA의 혜택을받지 못합니다. 컴파일러 스위치를 통해 SSE2를 활성화하는 것만으로는 충분하지 않습니다. SSE2를 사용하도록 코딩 된 라이브러리가 필요합니다. 내 취향대로 최고의 선형 대수학 라이브러리는 Eigen입니다. 사용하기 쉽고 SIMD (SSE2는 물론)를 지원합니다.

+0

비 순차 순서로 방정식을 푸는 것은 무엇을 의미합니까? 나는이 문제가 실제로 여러 변수를 최적화하는 문제라는 것을 알고있다. (나는이 프로젝트가 나에게하는 습관을 가지고있다. 그러나 최적화 문제 내에서 최적화 문제가 있으므로 개별 최적화 문제를 병렬 처리 할 수 ​​있습니다. 문제를 설정하기 위해 메인 CPU를 얻으면 CUDA는 매개 변수 자체를 조정할 수 있고 CPU에 의해 명시 적으로 데이터가 공급되지 않고 반복 할 수 있습니까? CPU가 행렬과 CUDA를 해결하고 그것을 단순히 반환하는 것과는 반대로, 그 밖의 것은 무엇입니까? – Faken

+0

GPU를 멀티 코어 프로세서라고 생각하십시오. GPU에는 많은 코어가 있지만 각 코어는 CPU 코어보다 훨씬 약합니다. GPU는 병렬화의 강점을 가지고 있습니다. 전체 문제를 상호 의존적으로 실행할 수있는 하위 작업으로 나눌 수 있습니까? 말하자면, 방정식 1, 2, ..., N이 있습니다. 독립적으로 해결할 수 있습니까? 그렇다면 CUDA가 도움이 될 수 있습니다. CUDA로 코드를 작성하는 것이 더 어렵 기 때문에 CPU에서 코드를 먼저 병렬화하려고 할 수 있습니다. 내 경험상, 선형 대수학은 물론 병렬 적으로 다루기 힘든 것으로 알려져 있습니다. 물론 문제는 독립적 인 하위 작업으로 구성됩니다. – user401947

+0

CUDA는 C와 유사한 프로그래밍 언어입니다. GPU 코딩은 명시 적 메모리 관리를 필요로합니다. 데이터 이동에 대해서는 매우 신중해야합니다. 하나의 6x6 방정식을 풀고 CPU에 답을 돌려 주면 오버 헤드가 정당화되지 않습니다. GPU의 이점을 얻으려면 알고리즘이 매우 많은 수의 방정식을 한 번에 간소화 할 수 있어야합니다. 유선형 방정식 간에는 종속성이 없어야합니다. 그런 다음 GPU는 이러한 모든 수식을 CPU보다 빠르게 해결할 수 있습니다. – user401947

관련 문제