v1[i] < v2[i]
이 거의 사실이 아니거나 거의 항상 사실이거나 장기간 (일반적으로 특정 편향이 없을지라도) 일반적으로 동일하게 유지 될 것으로 예상되는 경우 "true"를 제공하는 다른 기술이 적용될 수 있습니다 조건 "(즉,"둘 다하지 말고 하나의 결과 무시 ")는 물론 가격이지만, 일부 결과를 무시하는 대신 실제로 작업을 건너 뛰게됩니다.
기술은 매우 간단 즉, 비교 (벡터화)을 수행 _mm_movemask_ps
과 비교 마스크를 수집 한 다음 3 케이스를 가지고 :
- 모든 비교는 같은 방식으로 가서 그들은 모두
false
을했다, 실행 적절한 "do something"코드는 조건이 없어지기 때문에 벡터화하기가 더 쉬울 수도 있습니다.
- 모든 비교는 같은 방식으로 수행되었으며 모두
true
입니다.
- 혼합되면 더 복잡한 논리를 사용하십시오. 당신이 필요에 따라 개별적으로 모든 비트를 확인할 수 있습니다 아니라 (를 결합 (스칼라 코드로 다시 하락,하지만 지금은 단지 1 FP는 훨씬에 대한 비교), 또는 "반복 만 이상 (UN) 설정 비트"트릭 중 하나를 사용 bitscan을 사용하여 실제 색인을 복구 할 수 있습니다.) 또는 가끔 마스킹 및 병합을 수행 할 수 있습니다.
3 가지 경우 모두 항상 관련이있는 것은 아닙니다. 일반적으로 조건부가 항상 같은 방식으로 적용되기 때문에 보통 3 가지 경우 모두 해당되는 것은 아니므로 "모두 같은"사례 중 하나를 매우 희귀하게 만들기 때문에 매우 간단합니다. "혼합".
이 기술은 항상 확실히 유용하지 않습니다. "혼합 된"사례는 복잡하고 느립니다. 빠른 경로는 일반성이 있어야하고 테스트 할 가치가있는 속도 여야합니다. 지점의 다른 측면에 비해 긴 모든 것을 고려하지 않습니다 좋은 간단한 벡터화 코드가있는 동안
는하지만 유용 할 수 있습니다, 측면 어쩌면 하나는, 매우 느리고 성가신입니다.예를 들어, 느린 쪽은 빠른 근사화 된 초월 함수에 대한 인수 축소를 수행해야 할 수도 있고, 아니면 내적을 취하기 전에 일부 벡터를 정규화하거나 행렬을 직교 화해야 할 수도 있습니다.
또는 양쪽면 모두 정확히 속도가 느리지 만 캐시에서 서로 다른 데이터를 제거 할 수 있습니다 (양 측면은 캐시에 들어있는 배열에 대한 루프이지만 배열은 함께 맞지 않습니다). 그래서 무조건적으로 수행하면 양쪽 모두가 느려집니다 그 (것)들의 아래로. 이것은 아마 진짜 일이지만, 나는 야생에서 그것을 보지 못했습니다 (아직).
또는 아마도 한쪽면 은 일 수 있습니다. 무조건 실행해야합니다. 일반적으로 파괴적인 일을 수행하고, 일부 IO는 수행합니다. 예를 들어, 오류 조건을 확인하고 로그하는 경우.
사용하는 내장 함수에 따라 달라집니다. 일반적인 방법은 마스크를 생성 한 다음 해당 마스크를 사용하여 두 가지 가능한 시나리오 중에서 사용할 값을 결정하는 것입니다. –
왜 내장 함수를 사용하여이 작업을 수행합니까? 컴파일러가 내장 된 비교 연산자를 사용하여 최적의 코드를 생성하지 못하는 이유는 무엇입니까? 너 해봤 니? –
실제 코드를 게시하는 것이 확실히 도움이 될 것입니다 ... –