인텔 내장 함수를 사용하여 여러 개의 단 정밀도 연산을 병렬로 수행하는 알고리즘을 작성했습니다. 내 알고리즘의 각 반복의 결과는 단일 256 비트 벡터 (__m256
)의 0이 아닌 항목의 수입니다. 예를 들어__mm256 벡터에서 0이 아닌 항목의 수를 계산하는 가장 빠른 방법은 무엇입니까?
:
반복의 결과가 4벡터의 수가 제로가 아닌 항목을 계산하는 가장 빠른 방법은 무엇입니까이다
00000000 FFFFFFFF 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFF
?
float results[8];
_mm256_storeu_ps(results, result_vector);
int count = 0;
for (uint32_t idx = 0; idx < 8; ++idx)
{
if (results[idx] != 0)
{
++count;
}
}
이 방법은 잘 작동하지만, 아마도, 상점을 포함하지 않는 한 그것을 할 수있는 더 효율적인 방법이 있는지 궁금 :
현재 나는이 같은 일을하고 있어요.
0이 아닌 항목은 '0xFFFFFFFF'가 보장됩니까? 그렇다면 마스크를 사용하여 각 32 비트 섹션에서 최하위 비트를 분리 한 다음 절대 차이의 합을 적용하는 것이 좋습니다. – njuffa
아니면 그냥 제로 ('_mm256_cmp_ps')와 비교하고, 비트 마스크 ('_mm256_movemask_ps')를 추출하고'popcnt'를 사용하여 비트를 계산합니까? 3 가지 지시 사항. –
이미 0/0xFFF ... (즉, 비교 결과)이면 'cmpps' 단계를 건너 뛰고 movemask/popcnt 만 이동할 수 있습니다. –