Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Neuer Intel-Compiler beschleunigt auch AMD-Prozessoren


Gast
2004-02-11, 19:00:38
Lest selbst:www.planet3dnow.de/cgi-bin/newspub/viewnews.cgi?category=1&id=1076517925:kratz:

Avalox
2004-02-11, 20:12:03
proc_init_N ist bestimmt von fürsorglichen Intel Entwicklern geschaffen worden, um arme AMD User vor inkompatiblen Code zu bewahren. Sonst hätte ich doch glatt gedacht, dass die nicht vorhandenen Intel Marketing Vorgaben dahinter stecken. ;)

Gast
2004-02-11, 21:31:11
gabs bei mmx gabs bei sse1 brauchte man immer nur die geniue abfrage ausschalten nix neues

Godmode
2004-02-11, 22:41:22
was ist den die geniue abfrage?

haifisch1896
2004-02-11, 23:00:23
Da wird geprüft, ob ein Intel oder ein anderer Prozessor verbaut ist. Ist es kein Intel, wird nicht beschleunigt.
Durch die Abschaltung dieser Funktion beschleunigt der Compiler auch andere Prozessoren.
Ich hoffe, das war eine einfache Erklärung.

zeckensack
2004-02-11, 23:23:04
Richtig. Intel-Prozessoren werden idR am "GenuineIntel"-String erkannt, welcher im Grunde keine besondere Signifikanz hat, und nur zur Information des Users dient. Diverse Code-Beispiele (uA von Intel selbst ...) beziehen aber diesen String in die Prüfung des Feature-Sets mit ein. Und manche Programmierer sind halt dumm genug, darin nicht den Unsinn zu erkennen, der es ist ... oder sie haben generell zu wenig Ahnung von Assembler, um dort Änderungen vornehmen zu können - soll's ja auch geben :)

http://www.anandtech.com/cpu/showdoc.html?i=1543&p=5
Normally how you're supposed to detect whether or not a processor supports SSE is by looking at the SSE bit in the standard features register. If the SSE bit is set to true, then the processor you're dealing with supports SSE; if it's set to false, then your processor doesn't support SSE. The Athlon has this bit set to false since it doesn't have a full SSE implementation, however the Mobile Athlon 4, Athlon MP and the Athlon XP all have this bit set to true. The problem with SYSMark isn't really a problem with SYSMark, it's a problem with Windows Media Encoder 7. Windows Media Encoder 7 doesn't look at this bit to determine whether to use SSE or not, instead it reads the manufacturer code in the CPUID string of the processor. If the manufacturer code reads 'GenuineIntel', as all Intel processors report, and the SSE bit is enabled then WME7 uses SSE. This wasn't a problem until recently since AMD processors didn't have SSE support, but now with the Palomino core they do have SSE support but according to the WME7 SSE detection algorithm they will never run WME7 with SSE enabled. The reason behind this being that the manufacturer string outputted by all AMD processor is 'AuthenticAMD' which doesn't pass WME7's test for SSE compliance. Microsoft is aware of the problem and will fix it in the next version of Windows Media Player, but that doesn't change the issue with SYSMark since it relies heavily on WME7 for determining performance.

Endorphine
2004-02-11, 23:50:54
Wer Videos mit WMV statt mit MPEG-1/2/4 kodiert gehört sowieso gesteinigt. Also - was soll's, wenn Micro$~1 dort in der "SSE-verwenden-oder-nicht"-Funktion Mist geschrieben hat? Ist doch eher noch eine zusätzliche Strafe für diejenigen, die Videos plattformgebunden kodieren. ;)

Wieder ein Grund mehr, die Finger von Software zu lassen, die MS nur für die Monopolsicherung geschrieben hat.

Edit: Xvid steuert übrigens zügig auf die Revision 1.0 zu -> http://www.xvid.org/. =)
Edit:
Changes since 1.0.0 beta2 (Ciao):

* xvidcore:
[...]
o Enabled SSE2 assembly code for IA32 platforms. Wer Lust hat kann Xvid ja mal auf eine saubere SSE2-Erkennung überprüfen. *eg* Ich wette, dass der Code nicht solchen Käse enthält wie der WME.

LOCHFRASS
2004-02-12, 00:09:35
Kann man den Namen eigentlich auch noch so wie damals bei den Cyrix (oder war das IDT?) faken?

Endorphine
2004-02-12, 00:13:30
Original geschrieben von LOCHFRASS
Kann man den Namen eigentlich auch noch so wie damals bei den Cyrix (oder war das IDT?) faken? In Hardware kann das nur noch der C3 (bin mir aber auch nicht mehr sicher).

p.s. Mir juckt es nach zeckensack's Posting zu den WME-Schwachstellen jetzt in den Fingern, die "cpuid.asm"-Datei aus der Xvid-Source hier zu post0rn. ;(

Endorphine
2004-02-12, 00:17:50
Ich mach's einfach mal *eg* :weg:

Können die Programmier-Gurus den Code mal eben bezüglich der Qualität analüsieren? Habe zuletzt ungefähr 2000 mit x86-Assembler rumgespielt.... (Schriftart bzw. UA-Stylesheet-Schriftart vergrössern über [Strg] + [+])
;/****************************************************************************
; *
; * XVID MPEG-4 VIDEO CODEC
; * - CPUID check processors capabilities -
; *
; * Copyright (C) 2001 Michael Militzer <isibaar@xvid.org>
; *
; * This program is free software ; you can redistribute it and/or modify
; * it under the terms of the GNU General Public License as published by
; * the Free Software Foundation ; either version 2 of the License, or
; * (at your option) any later version.
; *
; * This program is distributed in the hope that it will be useful,
; * but WITHOUT ANY WARRANTY ; without even the implied warranty of
; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; * GNU General Public License for more details.
; *
; * You should have received a copy of the GNU General Public License
; * along with this program ; if not, write to the Free Software
; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; *
; * $Id$
; *
; ***************************************************************************/

BITS 32

%macro cglobal 1
%ifdef PREFIX
global _%1
%define %1 _%1
%else
global %1
%endif
%endmacro

;=============================================================================
; Constants
;=============================================================================

%define CPUID_TSC 0x00000010
%define CPUID_MMX 0x00800000
%define CPUID_SSE 0x02000000
%define CPUID_SSE2 0x04000000

%define EXT_CPUID_3DNOW 0x80000000
%define EXT_CPUID_AMD_3DNOWEXT 0x40000000
%define EXT_CPUID_AMD_MMXEXT 0x00400000

;;; NB: Make sure these defines match the ones defined in xvid.h
%define XVID_CPU_MMX (1<< 0)
%define XVID_CPU_MMXEXT (1<< 1)
%define XVID_CPU_SSE (1<< 2)
%define XVID_CPU_SSE2 (1<< 3)
%define XVID_CPU_3DNOW (1<< 4)
%define XVID_CPU_3DNOWEXT (1<< 5)
%define XVID_CPU_TSC (1<< 6)

;=============================================================================
; Read only data
;=============================================================================

ALIGN 32
%ifdef FORMAT_COFF
SECTION .rodata data
%else
SECTION .rodata data align=16
%endif

vendorAMD:
db "AuthenticAMD"

;=============================================================================
; Macros
;=============================================================================

%macro CHECK_FEATURE 3
mov ecx, %1
and ecx, edx
neg ecx
sbb ecx, ecx
and ecx, %2
or %3, ecx
%endmacro

;=============================================================================
; Code
;=============================================================================

SECTION .text

; int check_cpu_feature(void)

cglobal check_cpu_features
check_cpu_features:

push ebx
push esi
push edi
push ebp

xor ebp, ebp

; CPUID command ?
pushfd
pop eax
mov ecx, eax
xor eax, 0x200000
push eax
popfd
pushfd
pop eax
cmp eax, ecx

jz near .cpu_quit ; no CPUID command -> exit


; get vendor string, used later
xor eax, eax
cpuid
mov [esp-12], ebx ; vendor string
mov [esp-12+4], edx
mov [esp-12+8], ecx
test eax, eax

jz near .cpu_quit

mov eax, 1
cpuid

; RDTSC command ?
CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, ebp

; MMX support ?
CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, ebp

; SSE support ?
CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT|XVID_CPU_SSE), ebp

; SSE2 support?
CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, ebp

; extended functions?
mov eax, 0x80000000
cpuid
cmp eax, 0x80000000
jbe near .cpu_quit

mov eax, 0x80000001
cpuid

; AMD cpu ?
lea esi, [vendorAMD]
lea edi, [esp-12]
mov ecx, 12
cld
repe cmpsb
jnz .cpu_quit

; 3DNow! support ?
CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp

; 3DNOW extended ?
CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp

; extended MMX ?
CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp

.cpu_quit:

mov eax, ebp

pop ebp
pop edi
pop esi
pop ebx

ret

; sse/sse2 operating support detection routines
; these will trigger an invalid instruction signal if not supported.
ALIGN 16
cglobal sse_os_trigger
sse_os_trigger:
xorps xmm0, xmm0
ret


ALIGN 16
cglobal sse2_os_trigger
sse2_os_trigger:
xorpd xmm0, xmm0
ret


; enter/exit mmx state
ALIGN 16
cglobal emms_mmx
emms_mmx:
emms
ret

; faster enter/exit mmx state
ALIGN 16
cglobal emms_3dn
emms_3dn:
femms
ret

Godmode
2004-02-12, 00:46:14
sry keine lust assambler durch zu checken:)

Godmode
2004-02-12, 00:47:08
Original geschrieben von hendrikhey
Da wird geprüft, ob ein Intel oder ein anderer Prozessor verbaut ist. Ist es kein Intel, wird nicht beschleunigt.
Durch die Abschaltung dieser Funktion beschleunigt der Compiler auch andere Prozessoren.
Ich hoffe, das war eine einfache Erklärung.

ja erklärung war gut und verständlich :up:

Gast
2004-02-12, 09:18:33
@Zeckensack
hmm
gabs hier nicht die frage, ob man die abfrage überhaupt stoppen darf;)


@Endo
Der OpenSource MPEG4 Video-Codec namens XviD steht kurz vor seinem Final-Release. Die Entwickler haben gestern den Release-Candidate 2 der Version 1.0 freigegeben.

Der XviD-Codec ist ähnlich wie DivX ein verlustbehafteter Codec zur Komprimierung von Video-Daten (Gegenteil: Lossless-Codecs). Einziger Unterschied: während DivX ein kommerzielles Projekt darstellt, ist XviD OpenSource und Freeware. In der Video-Szene ist XviD geschätzt ob seiner zahlreichen Einstellmöglichkeiten und der hervorragenden Qualität beim Encoden von High-Quality Filmen in CD-Größe. Mit den letzten 5er Version hat DivX zwar aufgeholt, jedoch gilt XviD in der Szene noch immer als der am besten geeignete Codec, um einen 90+ Minuten Film in DVD-Qualität auf eine handelsübliche CD zu bringen (vgl. Review).

XviD ist nicht neu. Die letzte Beta-Version 0.9.2. geistert bereits seit über einem Jahr durch die Entwicklerszene. Mit der Version 1.0 lässt man sich demnach schon ziemlich lange Zeit. Grund: der Codec wurde von Grund auf neu programmiert, soll jegliche Optimierungen für alle möglichen CPU-Familien beinhalten (inkl. K6-2+) und die Qualität der 0.9er Versionen noch einmal übertreffen.

Wer mit der Version 1.0 lieber noch warten will, bis die möglichen Kinderkrankheiten der Release-Candidates überstanden sind; es gibt für die Version 0.9.2. seit geraumer Zeit einen AMD optimierten Hotfix. Hier werden die memcpy Funktionen des AMD-Developer-Pakets statt der C-eigenen Routinen genutzt. Anwendung: einfach die xvid.dll im Windows\System32 Ordner durch die Version aus dem Archiv ersetzen! Die gepatchte DLL ist kompatibel mit den 0.9.2. XviD-Binaries von Koepi und Maniac, nicht mit denen von Nic. Leistungsgewinn beim Encoden unseres Testfiles aus den Mainboard-Reviews in höchster Qualität: 91 Sekunden statt 96 Sekunden.

zeckensack
2004-02-12, 16:53:44
Original geschrieben von Endorphine
Ich mach's einfach mal *eg* :weg:

Können die Programmier-Gurus den Code mal eben bezüglich der Qualität analüsieren? Habe zuletzt ungefähr 2000 mit x86-Assembler rumgespielt.... (Schriftart bzw. UA-Stylesheet-Schriftart vergrössern über [Strg] + [+])
<snip>
vendorAMD:
db "AuthenticAMD"
<snip>
; AMD cpu ?
lea esi, [vendorAMD]
lea edi, [esp-12]
mov ecx, 12
cld
repe cmpsb
jnz .cpu_quit

; 3DNow! support ?
CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp

; 3DNOW extended ?
CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp

; extended MMX ?
CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp

.cpu_quit:
<snip>Der Code ist leider auch nicht herstellerneutral. Es gibt AFAIK diverse Cyrix/IDT-, bzw VIA-Prozessoren mit 3DNow-Support. Die werden hier nicht korrekt erkannt.
Die SSE-Erkennung ist allerdings sauber.

Edith:
"VIA Cyrix III" (Cayenne/Gobi/Joshua) (http://www.sandpile.org/impl/m2c3.htm)
"VIA C3" (Samuel/Ezra) (http://www.sandpile.org/impl/c5.htm)

Endorphine
2004-02-12, 17:18:28
Original geschrieben von zeckensack
Der Code ist leider auch nicht herstellerneutral. Es gibt AFAIK diverse Cyrix/IDT-, bzw VIA-Prozessoren mit 3DNow-Support. Die werden hier nicht korrekt erkannt.
Die SSE-Erkennung ist allerdings sauber.

Edith:
"VIA Cyrix III" (Cayenne/Gobi/Joshua) (http://www.sandpile.org/impl/m2c3.htm)
"VIA C3" (Samuel/Ezra) (http://www.sandpile.org/impl/c5.htm) Danke. Als ich das "AuthenticAMD" las dachte ich schon, dass die Erkennung sich wieder an Herstellerstrings festbeisst, statt einfach nur die Feature Flags abzufragen.

Aber wenigstens kein SSE-Murks wie beim WME. :D