3DNOW MMX CPU Extensionen mit c/c++ abzufragen???
-
Hallöchen ,
ich möchte mich ein bisschen mit inline Assembler in Visual 6 auseinandersetzen, und suche eine Möglichkeit, zuverlässig 3DNOW bzw. MMX CPU Extensionen mit c/c++ abzufragen.
Vielleicht hat ja Wer ein bisschen Source zur Hand.Gruß Jens
-
c/c++ kennt kein mmx und 3dnow.
Bye, TGGC
-
aber c/c++ kennt inline assembler
such mal in der msdn nach cpu detection unter intel (glaub auch unter amd) hilft dir der Befehl cpuid weiter
-
Jo danke der Tipp mit "Cpuid" war gut .
Gruß Jens
-
der beste weg laut intel und amd ist, einfach vom gewünschten befehlssatz einen befehl ausführen und schauen ob es gelinkt.
z.B.
bool SSE2Support=true; try { __m128d a={0.f,0.f}; a=_mm_add_sd(a,a); } catch(...) { SSE2Support=false; }
rapso->greets();
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Assembler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
bestimmt haben ein paar assembler cracks ein paar verbesserungen aber für den anfang taugt es.
//! \brief Klasse um CPU Features auszulesen class Cpu { public: //! \brief Standard Konstruktor Cpu() : m_strVendor("Unkown"), m_strName("Unkown") { } //! \brief Liest die CPU aus void Detect() { char szVendor[13]; unsigned long eax, ebx, edx, unused; Cpuid(0, eax, ebx, unused, edx); *(unsigned long *)(szVendor) = ebx; *(unsigned long *)(szVendor + 4) = edx; *(unsigned long *)(szVendor + 8) = unused; szVendor[12] = '\0'; m_strVendor = szVendor; Cpuid(1, eax, ebx, unused, edx); m_bMMX = ((edx & 0x800000) != 0); m_bSSE = ((edx & 0x2000000L) != 0); m_bSSE2 = ((edx & 0x040000000) != 0); // amd 3dnow Cpuid(0x80000000, eax, ebx, unused, edx); if(eax >= 0x80000001) { Cpuid(0x80000001, eax, ebx, unused, edx); m_b3DNowEx = ((edx & 1<<29) != 0); m_b3DNow = ((edx & 1<<31) != 0); } CalculateSpeed(); } const std::string &GetVendor() const { return m_strVendor; } const std::string &GetName() const { return m_strName; } static unsigned long GetSpeed() { return m_nSpeed; } static bool IsMMX() { return m_bMMX; } static bool IsSSE() { return m_bSSE; } static bool IsSSE2() { return m_bSSE2; } static bool Is3dNow() { return m_b3DNowEx; } static bool Is3dNowEx() { return m_b3DNow; } //! \brief überladener Ausgabeoperator //! \param s Ausgabestream //! \param a Referenz auf ein Objekt //! \return Stream friend std::ostream &operator << (std::ostream &s, const Cpu &c) { s << "Cpu < " << c.m_strVendor << " "; s << c.m_strName << " "; s << c.m_nSpeed << "Mhz > "; s << "Supports < "; s << (c.m_bMMX ? "MMX " : ""); s << (c.m_bSSE ? "SSE " : ""); s << (c.m_bSSE2 ? "SSE2 " : ""); s << (c.m_b3DNowEx ? "3dNowEx " : ""); s << (c.m_b3DNow ? "3dNow " : ""); s << ">" << std::endl; return s; } private: //! \brief CPU Geschwindigkeit ermitteln void CalculateSpeed() { unsigned int nStartLow, nStartHigh; unsigned int nEndLow, nEndHigh; unsigned long long nStart = 0, nEnd = 0; #if defined(_MSC_VER) _asm { rdtsc mov [nStartLow], eax mov [nStartHigh], edx } #else asm volatile("rdtsc" : "=a"(nStartLow), "=d"(nStartHigh)); #endif #ifdef _WIN32 Sleep(1000); #else sleep(1); #endif #if defined(_MSC_VER) _asm { rdtsc mov [nEndLow], eax mov [nEndHigh], edx } #else asm volatile("rdtsc" : "=a"(nEndLow), "=d"(nEndHigh)); #endif nStart |= nStartHigh; nStart <<= 32; nStart |= nStartLow; nEnd |= nEndHigh; nEnd <<= 32; nEnd |= nEndLow; m_nSpeed = static_cast<unsigned long>(((nEnd - nStart) / 1) / 1000000); } //! \brief CPUID Wrapper Funktion void Cpuid( unsigned long function, unsigned long &out_eax, unsigned long &out_ebx, unsigned long &out_ecx, unsigned long &out_edx) { #if defined(_MSC_VER) _asm { cpuid mov [out_eax], eax mov [out_ebx], ebx mov [out_ecx], ecx mov [out_edx], edx } #else asm volatile("push %%ebx; cpuid; mov %%ebx, %%esi; pop %%ebx" : "=a"(out_eax), "=S"(out_ebx), "=c"(out_ecx), "=d"(out_edx) : "a"(function)); #endif } private: //! \brief CPU Vendor std::string m_strVendor; //! \brief CPU Name std::string m_strName; //! \brief ungefähre Taktfrequenz static unsigned long m_nSpeed; //! \brief MMX support static bool m_bMMX; //! \brief Streaming SIMD Extensions static bool m_bSSE; //! \brief Streaming SIMD Extensions 2 static bool m_bSSE2; //! \brief 3DNow! (AMD specific extensions) static bool m_b3DNowEx; //! \brief 3DNow! (vendor independant) static bool m_b3DNow; }; unsigned long Cpu::m_nSpeed = 0; bool Cpu::m_bMMX = false; bool Cpu::m_bSSE = false; bool Cpu::m_bSSE2 = false; bool Cpu::m_b3DNowEx = false; bool Cpu::m_b3DNow = false;
-
Ja super very danke ,das ist doch was.
Gruß Jens