Ich brauche einen schnellen Memory-Transpose-Algorithmus für meine Gauß'sche Faltungsfunktion in C / C ++. Was ich jetzt mache ist
%Vor%Es stellt sich heraus, dass bei dieser Methode die Filtergröße groß (oder größer als erwartet) sein muss oder dass die Transponierung länger dauert als die Faltung (zB für eine 1920x1080-Matrix nimmt die Faltung die gleiche Zeit wie die Transponierung für einen Filter) Größe von 35). Der aktuelle Transponierungsalgorithmus, den ich verwende, verwendet Loop Blocking / Tiling zusammen mit SSE und OpenMP. Ich habe eine Version mit AVX versucht, aber es ist nicht schneller. Irgendwelche Vorschläge, wie ich das beschleunigen kann?
%Vor%}
Transponiere 8x8 Float-Matrix mit AVX. Es ist nicht schneller als vier 4x4 Transpositionen.
%Vor%Ich würde vermuten, dass Ihre beste Wette wäre, zu versuchen, die Faltung und die Transponierung zu kombinieren - d. h. schreiben Sie die Ergebnisse der Convolve, die transponiert werden, während Sie gehen. Da die Speicherbandbreite in der Transponierung mit ziemlicher Sicherheit begrenzt ist, wird die Verringerung der Anzahl der für die Transponierung verwendeten Befehle nicht wirklich helfen (daher die fehlende Verbesserung durch die Verwendung von AVX). Durch die Reduzierung der Anzahl von Durchläufen über Ihre Daten erhalten Sie die besten Leistungsverbesserungen.
FWIW, auf einer 3 Jahre alten Core i7 M Laptop-CPU war diese naive 4x4-Transponierung kaum langsamer als Ihre SSE-Version, während sie auf einer neueren Intel Xeon E5-2630 v2 @ 2.60GHz Desktop-CPU fast 40% schneller war.
%Vor%Seltsamerweise ist die ältere Laptop-CPU schneller als der Dual-Desktop E5-2630 v2 mit dem doppelten Kern, aber das ist eine andere Geschichte:)
Sonst könnten Sie auch interessiert sein an Ссылка Ссылка (erfordert Login jetzt ...)
Tags und Links optimization sse avx openmp transpose