Das wird die allererste SO Frage sein, die ich posten werde!
%Vor%
Ich versuche, eine "Block-Matching" -Implementierung für eine Stereo-Vision-Anwendung unter Verwendung von Intels SSE4.2- und / oder AVX-Eigenarten zu optimieren. Ich verwende "Summe der absoluten Unterschiede", um den am besten passenden Block zu finden. In meinem Fall ist blockSize
eine ungerade Zahl, zB 3 oder 5. Dies ist ein Ausschnitt meines C ++ Codes:
Ich weiß, dass die Streaming SIMD Extension viele Anweisungen enthält, um das Block-Matching mit SAD zu erleichtern, z. B. _mm_mpsadbw_epu8
und _mm_sad_epu8
, aber alle zielen auf blockSize
s, die 4, 16 oder 32 sind a href="http://software.intel.com/de-de/articles/motion-stimation-with-intel-streaming-simd-extensions-4-intel-sse4#F.%20Intelr%20SSE4%20-% 20Optimized% 20Function% 20for% 2016x16% 20Blocks "title=" ein Beispiel von Intel demonstriert BM SSE4.2 Optimierung "> zB dieser Code von Intel . Mein Problem ist, dass in meiner Anwendung blockSize
eine ungerade Zahl ist, meistens 3 oder 5.
Ich habe den folgenden Ausgangspunkt berücksichtigt:
%Vor% aber von hier aus kenne ich keine Möglichkeit, 3 oder 5 aufeinanderfolgende Bytes aus s0
! zusammenzufassen!
Ich würde mich über irgendwelche Gedanken darüber freuen.
Ich vermute, wenn blocksize so klein wie 3-5 Bytes x 3-5 Bytes ist, würden Sie ziemlich wenig Nutzen aus der Verwendung von SSE oder ähnlichen Anweisungen erhalten, weil Sie viel zu viel von dem "Gewinn" ausgeben werden die Mathematik schnell in "Swizzling" (Verschieben von Daten von einem Ort zum anderen).
Wenn man sich jedoch den Code anschaut, sieht es so aus, als würden Sie mehrere rImage[i, j]
mehrfach verarbeiten, was meiner Meinung nach keinen Sinn ergibt.
Tags und Links optimization c c++ sse simd