다른 사람들이 말했듯이, 범위는 2^n-1이어야하고 심지어 실행 시간에 완료되면 문제가 발생합니다.
최근 아키텍처 (P4 시대 이후의 모든 것)에서 정수 나누기 명령의 대기 시간은 26 ~ 50 정도입니다. 최악의 경우입니다. 비교에서 곱셈은 1-3 사이클이 될 수 있으며 종종 병렬로 수행 될 수 있습니다.
DIV 명령은 EAX의 나머지와 EDX의 나머지를 반환합니다. "나머지"는 자유입니다 (모듈러스는 나머지 임). 당신은 당신이 &를 사용하고자하는 경우 범위, 실행시에 변수 뭔가를 구현하는 경우
, 당신은에 있습니다 범위^N-1이 경우 이렇게 사용하는 경우
가
가) 확인하여 & 코드 경로 :이 경우 거대한 레이턴시 전위 B)를 첨가 분기 가능한 캐시 미스 등등하지 2^N-1에있어서, DIV를 사용하는 대신에 분기 추가, DIV 명령
를 사용 방정식 (잘못된 캐시 제거와 함께 나쁜 경우에 수백 또는 수천 사이클의 비용이 드는 잠재력)은 DIV를 가장 확실한 선택으로 만듭니다. 또한 부호가있는 데이터 유형과 함께 &을 사용하는 경우 변환이 필요합니다 (혼합 데이터 유형의 경우 &은 없지만 DIV의 경우는 있음). 또한 DIV가 계수에서 분기하는 데에만 사용되고 결과의 나머지가 사용되지 않으면 투기 실행이 효율적으로 수행 될 수 있습니다. 또한 병렬로 명령을 실행할 수있는 다중 파이프 라인을 통해 성능 저하가 더욱 완화됩니다.
실제 코드를 사용하는 경우 많은 캐시가 작업중인 데이터와 곧 작업하거나 작업 한 다른 코드 및 데이터로 가득 차 있다는 것을 기억해야합니다. 실제로 캐시 페이지를 제거하고 분기 예측 오류로 인해 페이지를 기다리는 것을 원하지 않습니다. 대부분의 모듈로, 당신은 i = 7로가는 것이 아닙니다. d = i % 4; 당신은 종종 그 자체가 (예측되고 캐싱 된) 서브 루틴 호출 인 서브 루틴을 호출하는 더 큰 코드를 사용하고 있습니다. 또한 루프 자체에서 분기 예측을 사용하고있을 수도 있습니다. 루프를 가진 중첩 된 분기 예측은 현대 마이크로 프로세서에서 꽤 잘 처리되지만, 예측하려고하는 것을 추가하는 것은 매우 어리 석다.
요약하면 DIV를 사용하면 일반적인 사용 사례에 대해 최신 프로세서에 더 적합합니다. 컴파일러가 캐시 고려 사항 및 다른 것들 때문에 2^n-1을 생성하는 것은 실제로 "최적화"가 아닙니다. 정수 나누기를 미세 조정할 필요가 있고 전체 프로그램이 이에 의존하는 경우 2^n-1로 제수를 하드 코딩하고 비트 단위로 & 논리를 직접 만듭니다.
마지막으로 정수 분할을위한 전용 ALU 유닛은 실제로 데이터 경로가 끝나기 때문에 대기 시간을 6 ~ 8 사이클 정도로 줄이며, 비교적 큰 다이 영역을 차지합니다. 정수 DIV가 어떻게 작동하는지 알 수있을 때 128 비트 너비와 아무도 부동산을 보유하지 못합니다.
당신은 그 사람들이 어떻게 동일하다고 생각합니까? 예를 들어 해본 적이 있습니까? 음수로? – ildjarn
... 또는 실제로 2 대 숫자가 아닌 모든 범위가 있습니까? – dmckee
'&'는 * 논리적이고 * "* 아닙니다. –