In meinem Projekt habe ich Basic-Klasse CVector implementiert. Diese Klasse enthält den Zeiger float * auf das rohe Fließkomma-Array. Dieses Array wird dynamisch mit der Standardfunktion malloc () zugewiesen.
Jetzt muss ich einige Berechnungen mit solchen Vektoren beschleunigen. Da der Speicher nicht mit _mm_malloc () zugeordnet ist, ist er leider nicht ausgerichtet.
Wie ich verstehe, habe ich zwei Möglichkeiten:
1) Schreiben Sie den Code neu, der Speicher reserviert, um _mm_malloc () zu verwenden und zum Beispiel den folgenden Code zu verwenden:
%Vor%2) Die zweite Option besteht darin, die _mm_loadu_ps () - Anweisung zu verwenden, um __m128 aus dem nicht ausgerichteten Speicher zu laden und dann für die Berechnung zu verwenden.
%Vor%Also meine Frage ist, welche Option wird besser oder schneller?
Das Lesen nicht ausgerichteter SSE-Werte ist außerordentlich teuer. Überprüfen Sie die Intel Handbücher, Band 4, Kapitel 2.2.5.1. Der Kerntyp macht einen Unterschied, i7 hat zusätzliche Hardware, um es kostengünstiger zu machen. Aber das Lesen eines Werts, der die Cpu-Cache-Zeilengrenze überspannt, ist immer noch 4,5 mal langsamer als das Lesen eines ausgerichteten Werts. Es ist zehn mal langsamer auf früheren Architekturen.
Das ist massiv, bringen Sie den Speicher in die richtige Richtung, um diesen Perf-Treffer zu vermeiden. Nie gehört von _mm_malloc, verwenden Sie _aligned_malloc () von der Microsoft CRT, um richtig ausgerichteten Speicher vom Heap zu erhalten.
Sehen Sie sich bullet physics an. Es wurde für eine Handvoll Filme und bekannte Spiele (GTA4 und andere) verwendet. Sie können entweder ihre superoptimierten Vektor-, Matrix- und andere Mathematikklassen ansehen oder sie einfach verwenden. Es ist unter zlib-Lizenz veröffentlicht, so dass Sie es einfach verwenden können, wie Sie möchten. Erfinde das Rad nicht neu. Bullet, Nvidia Physx, Havok und andere Physik-Bibliotheken sind gut getestet und optimiert von wirklich schlauen Jungs