당신은 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 초 걸립니다. 한 시간 조금 남았습니다.