긴 게시물에 대해 죄송하지만 첫 번째 이동과 관련이 있다고 생각되는 모든 것을 포함하고 싶었습니다.
내가 원하는 것
고밀도 행렬에 대한 병렬 버전의 Krylov Subspace Methods를 구현하고 있습니다. 주로 GMRES, QMR 및 CG. 나는 (프로파일 링 후) 내 DGEMV 루틴이 한심하다는 것을 깨달았다. 그래서 나는 그것을 격리함으로써 그것에 집중하기로 결정했습니다. 12 코어 시스템에서 실행하려고 시도했지만 아래 결과는 4 코어 Intel i3 랩톱에 대한 것입니다. 트렌드에는 큰 차이가 없습니다.
내 KMP_AFFINITY=VERBOSE
출력은 여기에서 사용할 수 있습니다 .
작은 코드를 작성했습니다.
size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50
x = Matrix_Vector_Multi(A,b);
end
나는 이것이 50 번의 반복에 대한 CG의 동작을 시뮬레이션한다고 생각합니다.
내가 시도한 것 :
번역
나는 원래 포트란에서 코드를 작성했다. 나는 그것을 C, MATLAB 및 Python (Numpy)으로 번역했습니다. 말할 것도없이 MATLAB과 Python은 끔찍했습니다. 놀랍게도, C는 위의 값에 대해 FORTRAN보다 1 초 또는 2 초 더 낫습니다. 일관되게.
프로파일 링
코드를 실행하도록 프로파일 링했으며 46.075
몇 초 동안 실행되었습니다 . MKL_DYNAMIC이 설정FALSE
되고 모든 코어가 사용 된 시점 입니다. MKL_DYNAMIC을 true로 사용하면 특정 시점에 코어 수의 절반 만 사용되었습니다. 다음은 몇 가지 세부 사항입니다.
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
가장 시간이 많이 걸리는 프로세스는 다음과 같습니다.
Call Stack LAX16_N4_Loop_M16gas_1
CPU Time by Utilization 157.926s
CPU Time:Total by Utilization 94.1%
Overhead Time 0us
Overhead Time:Total 0.0%
Module libmkl_mc3.so
다음은 몇 가지 그림입니다.
결론 :
프로파일 링의 초보자이지만 속도가 여전히 좋지 않다는 것을 알고 있습니다. 순차적 (1 코어) 코드는 53 초 안에 완료됩니다 . 그것은 1.1 이하의 속도입니다!
실제 질문 : 속도 향상을 위해 어떻게해야합니까?
도움이 될 것 같지만 확신 할 수없는 것 :
- Pthreads 구현
- MPI (ScaLapack) 구현
- 수동 튜닝 (방법을 모르겠습니다. 제안하는 경우 리소스를 권장하십시오)
누구든지 (특히 메모리 관련) 세부 정보가 더 필요하면 내가 무엇을 어떻게 실행 해야하는지 알려주십시오. 나는 메모리 프로파일 링을 해본 적이 없다.