A와 B는 벡터 또는 길이 N입니다. 여기서 N은 20에서 200 사이의 값일 수 있습니다. 이 벡터들 사이의 거리의 제곱을 계산하고 싶습니다. 즉 d^2 = || A-B ||^2입니다.SSE2를 사용하여 거리 계산을 벡터화하는 방법
지금까지 내가 가진 : 내 코드를 프로파일 링하고이 (시간의 50 % 이상이 바로이 일을 소요됩니다) 병목 점을 제외 보인다
float* a = ...;
float* b = ...;
float d2 = 0;
for(int k = 0; k < N; ++k)
{
float d = a[k] - b[k];
d2 += d * d;
}
는 잘 작동 할 수 있습니다. Windows 7의 Visual Studio 2012에서 다음 최적화 옵션 인 /O2 /Oi /Ot /Oy-
을 사용하고 있습니다. 제 이해는 VS2012가 해당 루프를 자동 벡터화해야한다는 것입니다 (SSE2 사용). 그러나 코드에 #pragma loop(no_vector)
을 삽입하면 눈에 띄는 속도가 느려지지 않으므로 루프가 벡터화되지 않습니다. 컴파일러는 확인이이 메시지 :
info C5002: loop not vectorized due to reason '1105'
내 질문
은 다음과 같습니다- 는 VS2012 그것을 벡터화 할 수 있도록이 코드를 수정할 수 있습니까?
- 그렇지 않다면 코드를 직접 벡터화하려고하는 것이 맞습니까?
- SSE2 코딩에 대해 배우려면 저에게 웹 사이트를 권장 할 수 있습니까?
- 벡터화가 생산성을 떨어 뜨릴 수있는 N 미만의 값이 있습니까?
reason '1105'
은 무엇입니까?
+1은/fp : fast 옵션에 해당합니다. 코드가 벡터화됩니다. 감사! 그러나 (/ fp : fast를 사용하는 경우에도) 코드는 실제로/fp : fast가없는 원래 코드보다 두 배 오래 걸립니다. 새로운 []/delete []는 대히트입니다. 힙 할당 된 dist를 스택 할당 된 버퍼로 대체하는 것은 시간의 절반을 줄여서 시작 시간을 다시 시작하게합니다. 데이터를 두 번 반복하는 것도 대히트입니다. 가장 좋은 방법은 원래 코드를 유지하고/fp : fast를 사용하여 2 배속을 향상시키는 것입니다. – Bull
또한 MSDN의 1105 오류 코드 페이지에 감사드립니다. 왜 그 페이지를 찾을 수 없었는지 확실하지 않았습니다. 코드를 제거하면이 대답을 수락합니다./fp : fast를 사용하는 원래 코드는 필자가 선호하는 솔루션입니다. – Bull
@ user2151446 필자의 테스트 케이스에서는 예제의 코드가 벡터화되지 않았으므로 코드가 제거되었으므로 추가 된 복잡성이 있습니다. 나는 내일 그것에 대해 질문 할 것입니다. – masrtis