>백엔드 개발 >C++ >루프 카운터를 32비트에서 64비트로 변경하면 Intel CPU의 _mm_popcnt_u64 성능에 큰 영향을 미치는 이유는 무엇입니까?

루프 카운터를 32비트에서 64비트로 변경하면 Intel CPU의 _mm_popcnt_u64 성능에 큰 영향을 미치는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-17 01:00:25829검색

Why Does Changing a Loop Counter from 32-bit to 64-bit Dramatically Impact _mm_popcnt_u64 Performance on Intel CPUs?

32비트 루프 카운터를 64비트로 교체하면 Intel CPU에서 _mm_popcnt_u64로 엄청난 성능 편차가 발생합니다

문제 요약

popcount 벤치마크의 성능은 루프 카운터 변수가 변경 사항이 루프의 기본 작동에 영향을 주지 않는 것으로 나타났음에도 불구하고 32비트 무부호에서 64비트 무부호로 변경되었습니다.

질문

  1. 왜 32비트와 64비트 루프 카운터를 사용하는 것 사이에 성능 차이가 있습니까?
  2. 어떻게 할 수 있나요? 일정하지 않은 버퍼 크기를 상수 값으로 바꾸면 코드가 느려지나요?
  3. 버퍼 크기 변수에 '정적' 키워드를 추가하면 어떻게 64비트 루프가 만들어지나요? 빨리요?

답변

1. 성능 차이는 Intel CPU의 popcnt 명령에 있는 잘못된 데이터 종속성으로 인해 발생합니다.

루프 카운터가 32비트인 경우 각 루프 반복의 popcnt 명령은 독립적으로 실행되어 병렬을 허용합니다. 실행. 그러나 루프 카운터가 64비트인 경우 popcnt 명령어 사이에 잘못된 데이터 종속성이 도입되어 병렬 실행이 불가능해집니다. 이러한 종속성은 다음 반복에 재사용되는 popcnt 명령어의 대상 레지스터로 인해 발생하며, 성능을 제한하는 인위적인 종속성을 생성합니다.

2. 일정하지 않은 버퍼 크기를 상수 값으로 바꾸면 컴파일러가 일부 최적화를 수행하지 못하게 되므로 코드 속도가 느려질 수 있습니다.

일정한 버퍼 크기를 사용하면 컴파일러는 버퍼의 정확한 크기를 알 수 있습니다. 이를 통해 보다 효율적인 메모리 액세스 패턴과 명령어 스케줄링이 가능해집니다. 그러나 버퍼 크기가 일정하지 않은 경우 컴파일러는 최악의 시나리오를 가정해야 하며, 이는 덜 최적화된 코드로 이어질 수 있습니다.

3. 버퍼 크기 변수에 '정적' 키워드를 추가하면 버퍼 크기가 컴파일 시간 상수가 되어 컴파일러가 추가 최적화를 수행할 수 있으므로 64비트 루프가 더 빨라집니다.

버퍼 크기를 컴파일 타임 상수로 지정하면 컴파일러는 메모리 액세스 패턴과 명령어 스케줄링을 보다 적극적으로 최적화하여 코드 속도를 높일 수 있습니다.

강의 학습

루프의 작은 변경이라도 예상치 못한 종속성이나 컴파일러 최적화로 인해 성능에 큰 영향을 미칠 수 있습니다. 효율적인 코드를 작성하려면 이러한 종속성과 성능에 어떤 영향을 미치는지 이해하는 것이 중요합니다.

위 내용은 루프 카운터를 32비트에서 64비트로 변경하면 Intel CPU의 _mm_popcnt_u64 성능에 큰 영향을 미치는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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