문제

내 응용 프로그램에서 3D 수학을 광범위하게 사용하고 있습니다.벡터/행렬 라이브러리를 SSE, AltiVec 또는 유사한 SIMD 코드로 변환하면 속도를 얼마나 높일 수 있습니까?

도움이 되었습니까?

해결책

내 경험에 따르면 일반적으로 x87에서 SSE로 알고리즘을 가져오는 경우 약 3배의 개선이 이루어졌습니다. 더 나은 VMX/Altivec으로 전환 시 5배 이상 향상(파이프라인 깊이, 스케줄링 등과 관련된 복잡한 문제로 인해).그러나 나는 보통 임시적으로 한 번에 하나의 벡터를 수행하는 경우가 아니라 작업할 숫자가 수백 또는 수천 개가 있는 경우에만 이 작업을 수행합니다.

다른 팁

이것이 전부는 아니지만 SIMD를 사용하여 추가 최적화를 얻는 것이 가능합니다. Miguel이 MONO를 사용하여 SIMD 명령어를 구현했을 때의 프레젠테이션을 살펴보세요. PDC 2008,

SIMD beats doubles' ass in this particular configuration.
(원천: tirania.org)

Miguel의 블로그 항목에 있는 사진입니다.

매우 대략적인 수치의 경우:몇몇 사람들한테 들었어 ompf.org 수동으로 최적화된 일부 레이 트레이싱 루틴의 속도가 10배 향상되었다고 주장합니다.나는 또한 좋은 속도 향상을 경험했습니다.나는 문제에 따라 내 루틴이 2배에서 6배 사이인 것으로 추정하며, 이들 중 다수에는 불필요한 저장과 로드가 몇 개 있었습니다.코드에 엄청난 양의 분기가 있는 경우에는 잊어버리십시오. 그러나 자연적으로 데이터 병렬인 문제의 경우에는 꽤 잘 수행할 수 있습니다.

그러나 귀하의 알고리즘은 데이터 병렬 실행을 위해 설계되어야 한다는 점을 덧붙이고 싶습니다.이는 언급한 대로 일반 수학 라이브러리가 있는 경우 개별 벡터가 아닌 압축된 벡터를 사용해야 하며 그렇지 않으면 시간을 낭비하게 될 것임을 의미합니다.

예:같은 것

namespace SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  //...
};
}

대부분의 문제 성능이 중요한 곳 대규모 데이터 세트로 작업할 가능성이 높으므로 병렬화할 수 있습니다.귀하의 문제는 나에게 조기 최적화 사례처럼 들립니다.

3D 작업의 경우 W 구성 요소에서 초기화되지 않은 데이터를 주의하세요.W의 잘못된 데이터로 인해 SSE 작업(_mm_add_ps)이 일반 시간의 10배가 걸리는 경우를 본 적이 있습니다.

대답은 라이브러리가 수행하는 작업과 사용 방법에 따라 크게 달라집니다.

이득은 몇 퍼센트 포인트에서 "몇 배 더 빠르게"까지 갈 수 있습니다. 이득을 보기 가장 쉬운 영역은 고립된 벡터나 값을 처리하는 것이 아니라 프로세스에서 처리해야 하는 여러 벡터나 값을 다루는 영역입니다. 같은 길.

또 다른 영역은 캐시 또는 메모리 제한에 도달하는 경우이며, 이는 다시 많은 값/벡터를 처리해야 합니다.

이득이 가장 클 수 있는 영역은 아마도 이미지 및 신호 처리, 계산 시뮬레이션, 메시에 대한 일반 3D 수학 연산(격리된 벡터가 아닌) 영역일 것입니다.

요즘 x86용 모든 우수한 컴파일러는 기본적으로 SP 및 DP 부동 수학에 대한 SSE 명령어를 생성합니다.스칼라 작업의 경우에도 올바르게 예약하는 한 기본 지침보다 이러한 지침을 사용하는 것이 거의 항상 더 빠릅니다.이는 과거에 SSE가 "느리다"고 생각하고 컴파일러가 빠른 SSE 스칼라 명령어를 생성할 수 없다고 생각했던 많은 사람들에게 놀라운 일이 될 것입니다.하지만 이제는 스위치를 이용해 SSE 생성을 끄고 x87을 사용해야 합니다.x87은 현재 더 이상 사용되지 않으며 향후 프로세서에서 완전히 제거될 수 있습니다.이것의 한 가지 단점은 레지스터에서 80비트 DP 부동을 수행하는 기능을 잃을 수 있다는 것입니다.그러나 정밀도를 위해 64비트 DP 부동 소수점 대신 80비트에 의존하는 경우 더 정밀한 손실 허용 알고리즘을 찾아야 한다는 것이 합의된 것 같습니다.

위의 모든 것은 나에게 완전히 놀라운 일이었습니다.매우 직관적이지 않습니다.하지만 데이터는 이야기합니다.

아마도 매우 작은 속도 향상만 볼 수 있을 것이며 프로세스는 예상보다 더 복잡해질 것입니다.자세한 내용은 다음을 참조하세요. 유비쿼터스 SSE 벡터 클래스 Fabian Giesen의 기사.

유비쿼터스 SSE 벡터 클래스:일반적인 신화를 폭로하다

그다지 중요하지 않음

무엇보다도 벡터 클래스는 생각만큼 프로그램 성능에 중요하지 않을 수 있습니다(만약 그렇다면 계산이 비효율적이기보다는 뭔가 잘못하고 있기 때문일 가능성이 더 높습니다).오해하지 마십시오. 적어도 3D 그래픽을 수행할 때 전체 프로그램에서 가장 자주 사용되는 클래스 중 하나일 것입니다.그러나 벡터 연산이 일반적이라고 해서 이것이 자동으로 프로그램의 실행 시간을 지배한다는 의미는 아닙니다.

별로 덥지 않아

쉬운 일이 아닙니다

지금은 아님

절대로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top