>백엔드 개발 >C++ >잘못된 데이터 종속성으로 인해 Intel CPU에서 64비트 Popcount가 32비트보다 느린 이유는 무엇입니까?

잘못된 데이터 종속성으로 인해 Intel CPU에서 64비트 Popcount가 32비트보다 느린 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-09 22:19:11862검색

Why is 64-bit Popcount Slower Than 32-bit on Intel CPUs Due to False Data Dependencies?

잘못된 데이터 종속성이 Intel CPU의 Popcount 성능에 영향을 미침

문제:

popcount에 대한 32비트 및 64비트 루프 카운터 사용 간의 성능 편차 Intel CPU에서의 작업. 64비트 카운터를 사용할 때 성능이 50% 떨어졌습니다. 처음에는 컴파일러 버그로 인해 발생했습니다.

설명: 잘못된 데이터 종속성

Intel CPU에는 잘못된 종속성이 있습니다. 이는 긴밀한 루프의 여러 반복에 영향을 미치는 popcnt 명령어의 대상 레지스터에 있습니다. 이 종속성은 대상 레지스터를 사용할 수 있을 때까지 명령을 지연시킵니다. 이 종속성의 영향을 받는 명령어 수는 루프의 위치에 따라 달라지며 결과적으로 성능 변화가 발생합니다.

종속성의 결과:

  • 다른 레지스터: 루프가 연속적인 popcnt 작업에 대해 다른 레지스터를 사용하는 경우 종속성은 루프 반복 전체에 분산됩니다. 성능에 큰 영향을 미칩니다.
  • 동일 레지스터: 모든 popcnt 작업이 동일한 레지스터를 사용하는 경우 종속성은 단일 반복 내에 유지되어 성능에 미치는 영향을 줄입니다.
  • 깨진 종속성 체인: 관련 없는 명령어(예: xor)를 도입하여 종속성을 끊으면 프로세서가 루프를 병렬화할 수 있어 성능이 향상됩니다.

컴파일러 동작:

GCC나 Visual Studio 모두 이 잘못된 종속성을 인식하지 못하므로 레지스터 할당에 따라 예측할 수 없는 성능이 발생합니다. Clang 및 ICC와 같은 다른 컴파일러에도 이러한 지식이 부족합니다.

AMD 성능:

AMD 프로세서는 이러한 잘못된 종속성을 갖지 않는 것으로 나타나 더 높은 성능에 기여합니다. 팝카운트의 성능

완화:

  • 인라인 어셈블리: 인라인 어셈블리를 사용하여 어셈블리 코드를 수동으로 최적화하면 컴파일러가 종속성을 인식하지 못하는 것을 우회할 수 있습니다. .
  • 의존성 깨기 체인: 각 popcnt 작업 후에 관련 없는 명령어를 삽입하면 잘못된 종속성이 해제되고 성능이 향상됩니다.
  • 다른 레지스터 사용: 연속적인 popcnt 작업에 대해 다른 레지스터를 할당하면 문제가 완화될 수 있지만, 항상 가능한 것은 아닙니다.

위 내용은 잘못된 데이터 종속성으로 인해 Intel CPU에서 64비트 Popcount가 32비트보다 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.