Próbowałem swoich sił w optymalizacji kodu, który używam w sisie wewnętrznym microsoft. Jednym z największych problemów podczas optymalizacji mojego kodu jest LHS, który ma miejsce, gdy chcę użyć stałej. Wydaje się, że istnieją pewne informacje na temat generowania pewnych stałych (here i here - section 13.4), ale wszystkie ich zgromadzenia (których wolałbym uniknąć).Stałe pływaki z kartą SIMD
Problem polega na tym, że próbuję zaimplementować to samo z wewnętrznym, msvc narzeka na niekompatybilne typy itp. Czy ktoś wie o jakichkolwiek równoważnych sztuczkach wykorzystujących wewnętrzne elementy?
Przykład - generowanie {1.0,1.0,1.0,1.0}
//pcmpeqw xmm0,xmm0
__m128 t = _mm_cmpeq_epi16(t, t);
//pslld xmm0,25
_mm_slli_epi32(t, 25);
//psrld xmm0,2
return _mm_srli_epi32(t, 2);
ten wytwarza wiązkę błędów około niezgodnych typu (__m128 vs _m128i). Jestem całkiem nowy w tym, więc jestem pewien, że brakuje mi czegoś oczywistego. Czy ktoś może pomóc?
tldr - W jaki sposób mogę wygenerować __m128 vec wypełniony pojedynczą stałą precyzją z ms intrinsics?
Dziękuję za przeczytanie :)
Co sprawia, że myślisz, że musisz to zrobić? Zazwyczaj stałe są ładowane tylko jeden raz, przed pętlą obliczeniową, więc względny koszt dostępu do pamięci jest nieistotny. –
Mam kilka stałych, z których wszystkie są używane w pętli, która niestety już wydaje się używać wszystkich rejestrów 8 x mm. Wewnątrz vnu dostaję bardzo wysoki CPI w punkcie, w którym używane są niektóre z tych stałych. Pomyślałem, że może uda mi się zmniejszyć liczbę stałych, do których uzyskuję dostęp, i wygenerować trochę, co może obniżyć koszty, ponieważ jeden ukrywa koszt drugiego. Co dziwne, użycie słowa kluczowego register na jednej ze stałych pomogło całkiem sporo (nawet jeśli spowodowało to, że zamiast tego zamiast wartości xmm wyprowadzono inną wartość). – JBeFat
Użyj x86-64, jeśli możesz - w ten sposób otrzymasz 16 rejestrów XMM. Zauważ również, że nawet jeśli otrzymasz jeden lub więcej pomyłek w pamięci podręcznej za pierwszym razem, gdy te stałe zostaną załadowane, powinno to zostać zamortyzowane w dużej liczbie iteracji, gdzie stałe będą następnie w pamięci podręcznej L1. (O ile oczywiście masz tylko małą liczbę iteracji pętli?) –