가능한 한 빨리 메모리 블록 두 개를 XOR하고 싶습니다. 어떻게 SIMD를 사용하여 가속시킬 수 있습니까?SIMD를 사용하여 두 개의 메모리 블록 XOR을 가속화하려면 어떻게해야합니까?
내 원래의 코드는 다음과 같습니다 :
void region_xor_w64( unsigned char *r1, /* Region 1 */
unsigned char *r2, /* Region 2 */
int nbytes) /* Number of bytes in region */
{
uint64_t *l1;
uint64_t *l2;
uint64_t *ltop;
unsigned char *ctop;
ctop = r1 + nbytes;
ltop = (uint64_t *) ctop;
l1 = (uint64_t *) r1;
l2 = (uint64_t *) r2;
while (l1 < ltop) {
*l2 = ((*l1)^(*l2));
l1++;
l2++;
}
}
은 나 자신을 하나 썼다, 그러나 약간의 속도가 증가.
void region_xor_sse( unsigned char* dst,
unsigned char* src,
int block_size){
const __m128i* wrd_ptr = (__m128i*)src;
const __m128i* wrd_end = (__m128i*)(src+block_size);
__m128i* dst_ptr = (__m128i*)dst;
do{
__m128i xmm1 = _mm_load_si128(wrd_ptr);
__m128i xmm2 = _mm_load_si128(dst_ptr);
xmm2 = _mm_xor_si128(xmm1, xmm2);
_mm_store_si128(dst_ptr, xmm2);
++dst_ptr;
++wrd_ptr;
}while(wrd_ptr < wrd_end);
}
실행중인 플랫폼은 무엇입니까? 사용 가능한 SIMD 기능은 매우 플랫폼에 따라 다릅니다. –
@JasonR SSE4.2를 지원하는 64 비트 Linux – foool
루프를 풀어 볼 수 있습니다. 출력 값마다 많은 크 런치를 수행하지 않을 때 큰 성능 향상을 얻는 것은 어렵습니다. 또한 정렬 된로드/저장 명령어를 사용하려는 경우 버퍼 정렬에주의해야합니다. –