내 other question과 관련하여 Sar (Successive Over-Relaxation) 방법을 사용하도록 스파 스 매트릭스 행 솔버를 수정했습니다. 코드는 다음과 지금과 같이이 SOR 솔버의 속도가 입력에 의존하는 이유는 무엇입니까?
void SORSolver::step() {
float const omega = 1.0f;
float const
*b = &d_b(1, 1),
*w = &d_w(1, 1), *e = &d_e(1, 1), *s = &d_s(1, 1), *n = &d_n(1, 1),
*xw = &d_x(0, 1), *xe = &d_x(2, 1), *xs = &d_x(1, 0), *xn = &d_x(1, 2);
float *xc = &d_x(1, 1);
for (size_t y = 1; y < d_ny - 1; ++y) {
for (size_t x = 1; x < d_nx - 1; ++x) {
float diff = *b
- *xc
- *e * *xe
- *s * *xs - *n * *xn
- *w * *xw;
*xc += omega * diff;
++b;
++w; ++e; ++s; ++n;
++xw; ++xe; ++xs; ++xn;
++xc;
}
b += 2;
w += 2; e += 2; s += 2; n += 2;
xw += 2; xe += 2; xs += 2; xn += 2;
xc += 2;
}
}
이제 이상한 일이다 : 나는 omega
(이완 인자)를 증가하는 경우, 실행 속도는 다양한 스토리지 내부의 값에 대한 극적으로을 따라하기 시작!
omega = 1.0f
의 경우 실행 시간이 다소 일정합니다. omega = 1.8
의 경우 처음에는 일반적으로이 step()
을 실행하는 데 5 밀리 초가 걸리지 만 시뮬레이션 중에 점진적으로 100 밀리 초까지 증가합니다. omega = 1.0001f
으로 설정하면 그에 따라 실행 시간이 약간 증가합니다. omega
이 높을수록 시뮬레이션 중에 더 빠른 실행 시간이 증가합니다.
모든 것이 유체 해석기 안에 내장되어 있기 때문에 독립 실행 형 예제를 찾기가 어렵습니다. 그러나 나는 초기 상태를 저장하고 실제 시간 단계를 해결할 때마다 그 상태에서 솔버를 다시 실행합니다. 초기 상태의 경우 속도가 빠르며 후속 시간 간격이 점차적으로 느려집니다. 나머지는 동일하기 때문에이 코드의 실행 속도는 6 개 배열의 값에 따라 달라진다는 것을 증명합니다.
이것은 VS2008로 32 비트 용으로 컴파일 할 때 64 비트 Windows 7뿐만 아니라 g ++가있는 Ubuntu에서도 재생성 가능합니다.
NaN 및 Inf 값이 부동 소수점 계산을 위해 느려질 수 있지만 NaN 또는 Infs는 존재하지 않는다고 들었습니다. 그렇지 않으면 부동 소수점 연산의 속도가 입력 숫자의 값에 따라 달라질 수 있습니까?
계산 값에 의존하는 다른 codepath를 측정하지 않겠습니까? – ebo
성능 문제가 계속 발생하면 이러한 계산에 GPU 사용을 고려하십시오. GPU는 드문 드문 매트릭스 작업에 능숙합니다. – Mark
@ebo : 저는이 호출을 측정하기 위해 Linux에서 실시간 클럭을 사용했습니다. 그래서 예, 저는 아주 확신합니다. – Thomas