T
Hallo,
danke für die Hinweise. Der Tipp mit dem Assembler anschauen war ganz hilfreich. Ohne automatische Compiler-Optimierung (-O0) sind dort Instruktionen zu finden welche auf dem SSE Register (xmm) ausgeführt werden. Sobald ich jedoch den Compiler optimieren lassen, sind dort keine SSE Register (xmm) mehr zu finden. Wenn ich das ganze mit dem ICC (7.1) compiliere sind in beiden Fällen noch SSE Register zu finden.
Hier mal meine (vereinfachten) Vector-Klassen:
Vector.h
class Vector
{
public:
float x, y, z;
Vector() { this->x = 0; this->y = 0; this->z = 0; };
Vector(const float x, const float y, const float z) { this->x = x; this->y = y; this->z = z; };
};
// +
static inline Vector operator + (const Vector &v1, const Vector &v2)
{
return Vector( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}
// -
static inline Vector operator - (const Vector &v1, const Vector &v2)
{
return Vector( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z );
}
// *
static inline Vector operator * (const Vector &v1, const Vector v2)
{
return Vector( v1.x*v2.x, v1.y*v2.y, v1.z*v2.z );
}
// /
static inline Vector operator / (const Vector &v1, const Vector v2)
{
return Vector( v1.x/v2.x, v1.y/v2.y, v1.z/v2.z );
}
VectorSSE:
#include <xmmintrin.h>
class VectorSSE
{
public:
__m128 vector;
VectorSSE() { vector = _mm_set_ps1(0.0f); }
VectorSSE(__m128 m128) { vector = m128;}
VectorSSE(const float x, const float y, const float z) { vector = _mm_set_ps(x, y, z, 0.0f); }
};
// +
static inline VectorSSE operator + (const VectorSSE &v1, const VectorSSE &v2)
{
return VectorSSE( _mm_add_ps(v1.vector, v2.vector) );
}
// -
static inline VectorSSE operator - (const VectorSSE &v1, const VectorSSE &v2)
{
return VectorSSE( _mm_sub_ps(v1.vector, v2.vector) );
}
// *
static inline VectorSSE operator * (const VectorSSE &v1, const VectorSSE &v2)
{
return VectorSSE( _mm_mul_ps(v1.vector, v2.vector) );
}
// /
static inline VectorSSE operator / (const VectorSSE &v1, const VectorSSE &v2)
{
return VectorSSE( _mm_div_ps(v1.vector, v2.vector) );
}
Uns hier mein Test:
// create timer
Timer timer = Timer();
// test 1
// without sse
timer.start();
Vector result1 = Vector(0, 0, 0);
for(int i = 0; i < ITERATIONS; ++i)
{
result1 = result1 + Vector( rand(), rand(), rand() );
result1 = result1 - Vector( rand(), rand(), rand() );
result1 = result1 * Vector( rand(), rand(), rand() );
result1 = result1 / Vector( rand(), rand(), rand() );
}
timer.stop();
timer.printResult("test 1 (without sse2)");
// test 2
// with sse
timer.start();
VectorSSE result2 = VectorSSE(0, 0, 0);
for(int i = 0; i < ITERATIONS; ++i)
{
result2 = result2 + VectorSSE( rand(), rand(), rand() );
result2 = result2 - VectorSSE( rand(), rand(), rand() );
result2 = result2 * VectorSSE( rand(), rand(), rand() );
result2 = result2 / VectorSSE( rand(), rand(), rand() );
}
timer.stop();
timer.printResult("test 2 (with sse)");
Gibt es noch eine Möglichkeit sich das Alignment anzuschaun?
Grüße, Tim