쿼리 응답 프로그램을 가속화하기 위해 Intel SIMD 내장 함수를 사용하려고합니다. query_cnt
이 입력에 의존하지만 SIMD 레지스터 수보다 항상 작다고 가정합니다 (즉, SIMD 레지스터를 보유하기에 충분한 SIMD 레지스터가 있음). 쿼리는 필요할 때마다로드하는 대신 애플리케이션의 핫 데이터이므로 처음에로드하고 레지스터에 항상 보관할 수 있습니까?SIMD 내장 함수를 사용할 때 레지스터에 입력 종속 핫 데이터를 유지하는 방법
쿼리가 float
유형이고 AVX256
이 지원된다고 가정합니다. 지금은 같은 것을 사용해야합니다 :
std::vector<__m256> vec_queries(query_cnt/8);
for (int i = 0; i < query_cnt/8; ++i) {
vec_queries[i] = _mm256_loadu_ps((float const *)(curr_query_ptr));
curr_query_ptr += 8;
}
나는 잠재적 인로드/저장 오버 헤드가 있기 때문에 그것은 좋은 방법이 아닙니다 알고있다, 그러나 적어도 그들이 할 수 있도록 vec_queries[i]
최적화 할 수있는 약간의 기회가있다 레지스터에 보관,하지만 난 여전히 좋은 방법이 아니라고 생각합니다.
더 좋은 아이디어가 있습니까?
다른 작업을 수행하지 않는 루프에서 여러 쿼리를 처리하고 있습니까? 그렇지 않은 경우 다음 쿼리를 수행 할 때 데이터가 레지스터에 남아 있지 않습니다. 아니면 쿼리에 전역 레지스터 변수를 사용하는 것이 가치 있다고 생각하십니까? GNU C는 이것을 할 수 있습니다.'__m256 vec_query0 asm ("ymm0");은 올바른 구문 IIRC 여야합니다. –
벡터를 레지스터에 보관하지 않는 것을 확인하기 위해 실제 asm을 살펴 보았습니까? 운이 좋으면 컴파일러가 std :: vector 동적 할당 오버 헤드의 대부분을 최적화 할 수 있습니다.그렇지 않은 경우 고정 크기 배열을 사용하십시오 (크기가 상한이기 때문에 사용하십시오). –
@PeterCordes 귀하의 조언에 감사드립니다. 실제 asm을 보지 않았지만 고정 크기 배열을 사용하는 것이 좋은 옵션 일 수 있으므로 모든 배열 요소를 레지스터에 바인딩하기 위해'__m256 vec_query0 asm ("ymm0")'과 같은 것을 사용할 수 있습니다. 그러나 그렇게한다면, 레지스터 중 일부는 항상 고정 요소에 의해 점유되어 성능 저하를 초래할 수 있습니까? – MarZzz