나는 이미지를 posterizing하기위한 함수를 만들었다._m128i를 SSE가있는 부호없는 int로 변환하려면 어떻게해야합니까?
// =(
#define ARGB_COLOR(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
inline UINT PosterizeColor(const UINT &color, const float &nColors)
{
__m128 clr = _mm_cvtepi32_ps( _mm_cvtepu8_epi32((__m128i&)color) );
clr = _mm_mul_ps(clr, _mm_set_ps1(nColors/255.0f) );
clr = _mm_round_ps(clr, _MM_FROUND_TO_NEAREST_INT);
clr = _mm_mul_ps(clr, _mm_set_ps1(255.0f/nColors) );
__m128i iClr = _mm_cvttps_epi32(clr);
return ARGB_COLOR(iClr.m128i_u8[12],
iClr.m128i_u8[8],
iClr.m128i_u8[4],
iClr.m128i_u8[0]);
}
첫 번째 줄에는 색상을 4 개의 수레로 풀지 만 그 반대의 경우 올바른 방법을 찾을 수 없습니다.
은 내가 SSE의 문서를 통해 검색과 하나가 존재 _mm_cvtepu8_epi32
의 반대를 찾을 수 없습니다?
_mm_extract_epi32()가 조금 도움이,하지만 당신은 "매우 서브 최적의"무엇을 의미합니까? – bitwise
일반적으로 데이터를 저장 한 후 즉시 다른 단어 크기로 다시 액세스하려고하면 엄청난 벌금이 부과됩니다. 필자가 보았던 'xmm'레지스터의 구성 요소를 추출하는 MSVC의 방법은 메모리에 저장하고 별도로 단어에 액세스하는 것입니다. 그러나 나는이 특별한 경우가 최악의 시나리오가 아니라고 생각한다. – Mysticial
어쨌든, 2048x2048의 22ms에서의 실행을 위해, 지금은 충분하다고 생각합니다. 덕분에) – bitwise