(SVML없이) 계수 부문의 사용을 요구하고 그래서 나는이 (죄송이이 overcommented 것)을 할 썼다 :SSE를 사용하여 두 변수의 모듈러스를 찾는 좋은 방법이 있습니까? 내가 SSE, 내가 제작 된 프로그램 중 하나를 사용하는 방법을 배우게하기 위해 노력하고있어
__m128i SSEModDiv(__m128i input, __m128i divisors)
{
//Error Checking (div by zero)
/*__m128i zeros = _mm_set1_epi32(0);
__m128i error = _mm_set1_epi32(-1);
__m128i zerocheck = _mm_cmpeq_epi32(zeros, divisors);
if (_mm_extract_epi16(zerocheck, 0) != 0)
return error;
if (_mm_extract_epi16(zerocheck, 2) != 0)
return error;
if (_mm_extract_epi16(zerocheck, 4) != 0)
return error;
if (_mm_extract_epi16(zerocheck, 6) != 0)
return error;*/
//Now for the real work
__m128 inputf = _mm_cvtepi32_ps(input);
__m128 divisorsf = _mm_cvtepi32_ps(divisors);
/*__m128 recip = _mm_rcp_ps(divisorsf); //Takes reciprocal
__m128 divided = _mm_mul_ps(inputf, recip); //multiplies by reciprical values*/
__m128 divided = _mm_div_ps(inputf, divisorsf);
__m128i intermediateint = _mm_cvttps_epi32(divided); //makes an integer version truncated
__m128 intermediate = _mm_cvtepi32_ps(intermediateint);
__m128 multiplied = _mm_mul_ps(intermediate, divisorsf); //multiplies the intermediate with the divisors
__m128 mods = _mm_sub_ps(inputf, multiplied); //subtracts to get moduli
return _mm_cvtps_epi32(mods);
}
문제는 릴리스에서 개별적으로 4 개의 32 비트 정수의 각 요소의 모듈러스를 취하는 것과 마찬가지로 대략 빠르며 (프로파일 링으로 찾은) 디버그에서 약 10 배 더 느립니다.
누구든지이 기능을 더 빠르게 만드는 방법에 대한 지침을 줄 수 있습니까? 나는 그것이 스칼라를 사용하는 것이 가장 좋습니다 그래서 input
및 divisors
는 정수 나누기 또는 계수에 대한 유용한 SIMD의 86 지침이없는의 일반적인 값의 비주얼 Studio-
[yeppp] (http://www.yeppp.info/#arguments)를 보았습니까? 비록 모듈로가 가속화 된 연산 중 하나라고 확신하지는 않지만 –
제수는 일반적인 경우의 모든 다른 값이거나 일반적으로 모두 동일한 값입니까? –
나는 yeppp를 보았다. modulo 함수를 제공하지 않는다 ...실제로 인텔 내장 함수를 훨씬 뛰어 넘는 것은 제공하지 않는 것 같습니다. 순수 내장 함수보다 빠릅니다. –