Block-Matching-Optimierung mit x86 / x64 Streaming SIMD Extension

9

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:

%Vor%

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.

    
Kamyar 11.04.2013, 16:09
quelle

1 Antwort

1

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.

    
Mats Petersson 11.04.2013 16:27
quelle

Tags und Links