2013-07-29 2 views
1

각 벡터는 200 좌표를 갖는 10^7 벡터의 기준을 변경해야합니다. 그래서 저는 하나의 [200 x 200] 매트릭스에 10^7 [200 x 1] 벡터를 곱합니다. 나는 아주 빨리 달릴 필요가 있지만 빨리 코딩해야한다. (하루 이하) 내 CUDA가 열악하기 때문에 CUDA 또는 OpenCL에서 코드를 처음부터 코딩하고 싶지는 않다. 어쩌면 기존 도서관에서 저에게 해 줄 수 있을까요? 솔루션에서 GPGPU를 사용하는 경우 행렬을 GPU로 한 번만 전송해야합니다. 그렇지 않으면 성능이 떨어집니다. OpenACC (또는 OpenMP, 나도 몰라)를 사용할 수 있을까요? 하루에이 작업을 수행 할 수 있습니까?하나의 고정 행렬에 거대한 수의 벡터를 곱하십시오.

필자는 (편리하고 윤리적 인 이유로) 오픈 소스 솔루션을 선호하지만 유료 솔루션 (비용이 너무 많이 들지 않는다고 가정)을 허용 할 수 있습니다.

내 논문입니다. 감사합니다.

답변

1

벡터를 매트릭스에 넣을 수 있습니다. 200 * 10^7은 시스템에 따라 많은 공간을 차지하므로 분할 할 수 있습니다. 그런 다음 BLAS와 같은 행렬 행렬 곱셈에 최적화 된 코드를 사용합니다. CPU, GPU (cuBLAS, MAGMA, ...), 멀티 코어 (PLASMA, ...) 또는 분산 메모리에 대한 많은 구현이 있습니다. 큰 행렬을 가질 것이기 때문에 행렬 벡터 곱셈을 수행하는 것보다 더 나은 가속도를 얻을 수 있습니다.

1

당신은 1 천만 개의 큰 벡터에 모두 동일한 거대한 행렬을 곱합니다. 가능한 모든 의사 결정을 미리 컴파일 할 수 있다면 가장 빠를 것입니다. 즉, 수많은 인덱스 계산과 루프 테스트가 수백만 번 동일하게 반복됩니다. 이것은 사전 컴파일을위한 완벽한 경우와 같습니다.

200x200 행렬 데이터 값을 입력으로 사용하는 작은 프로그램을 작성하고 입력 벡터를 입력 할 수있는 기능을 정의하는 프로그램 텍스트를 인쇄하십시오 결과 벡터를 출력하는 단계를 포함한다. 그것은 다음과 같이 보일 수 있습니다 :

void multTheMatrixByTheVector(double a[200], double b[200]){ 
    b[0] = 0 
    + a[0] * <a constant, the value of mat[0][0]> 
    + a[1] * <a constant, the value of mat[1][0]> 
    ... 
    + a[199] * <a constant, the value of mat[199][0]> 
    ; 
    b[1] = 0 
    + a[0] * <a constant, the value of mat[0][1]> 
    + a[1] * <a constant, the value of mat[1][1]> 
    ... 
    + a[199] * <a constant, the value of mat[199][1]> 
    ; 
    ... 
    b[199] = etc. etc. 
} 

당신이보고, 그 함수는 약 40000 라인 긴 수 있지만 괜찮은 컴파일러를 처리 할 수 ​​있어야합니다. 물론 행렬 요소 중 하나가 0 인 경우, 즉 일부 희소성이있는 경우 해당 행을 생략하거나 컴파일러 최적화 프로그램에서 수행 할 수 있습니다. CUDA 또는 벡터화 된 명령어에서이를 수행하려면 적절하게 수정해야하지만이를 수행 할 수 있어야합니다.

주 프로그램에이 기능을 포함 시키면 컴퓨터가 가능한 빨리 실행할 수 있어야합니다. 인덱스 계산, 루프 테스트 또는 빈 매트릭스 셀을 곱하는 순환을 낭비하지 않습니다.

그런 다음 번에 10ns가 걸리고 추가되면 봉투 뒷면에 벡터가 400 usec, 전체적으로 4000 초 걸립니다. 한 시간 조금 남았습니다.

관련 문제