SSE2 в VS2003
От: SMT  
Дата: 04.09.05 08:16
Оценка:
как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?
Re: SSE2 в VS2003
От: gear nuke  
Дата: 04.09.05 08:42
Оценка:
Здравствуйте, SMT, Вы писали:

SMT>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?


_M_IX86 = 700
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: SSE2 в VS2003
От: SMT  
Дата: 04.09.05 09:09
Оценка:
Здравствуйте, gear nuke, Вы писали:

SMT>>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?


GN>_M_IX86 = 700


спасибо! то, что нужно
Re[2]: SSE2 в VS2003
От: gear nuke  
Дата: 04.09.05 09:13
Оценка:
SMT>>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?

GN>_M_IX86 = 700


Хотя не уверен, насколько корректно привязываться к ключу /G7

/G7 optimize for Pentium 4 or Athlon

Может быть, лучше проверять ключик /arch:SSE2 ?
При этом _M_IX86_FP = 2
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: SSE2 в VS2003
От: SMT  
Дата: 04.09.05 15:04
Оценка:
Здравствуйте, gear nuke, Вы писали:

SMT>>>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?


GN>>_M_IX86 = 700


GN>Хотя не уверен, насколько корректно привязываться к ключу /G7

/G7 optimize for Pentium 4 or Athlon

GN>Может быть, лучше проверять ключик /arch:SSE2 ?
GN>При этом _M_IX86_FP = 2

это ещё лучше потому что такой exe изначально не запуститься без SSE2, поэтому можно безопасно использовать. не думал, что можно достать такие подробности из ключей компиляции
Re[3]: SSE2 в VS2003
От: SMT  
Дата: 04.09.05 15:15
Оценка:
Здравствуйте, gear nuke, Вы писали:

SMT>>>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?


GN>>_M_IX86 = 700


GN>Хотя не уверен, насколько корректно привязываться к ключу /G7

/G7 optimize for Pentium 4 or Athlon

GN>Может быть, лучше проверять ключик /arch:SSE2 ?
GN>При этом _M_IX86_FP = 2

в принципе, в моём проекте (http://sourceforge.net/projects/unrealspeccy) либо оба ключа, G7 и arch:SSE2, либо ни одного. поэтому мне без разницы. вот я и спросил, что попроще
Re[4]: SSE2 в VS2003
От: gear nuke  
Дата: 04.09.05 16:02
Оценка:
Здравствуйте, SMT, Вы писали:

SMT>>>>как через #ifdef определить, что проект компилируется с ключом /G7, чтобы использовать SSE2 вместо MMX?


GN>>>_M_IX86 = 700


GN>>Хотя не уверен, насколько корректно привязываться к ключу /G7

/G7 optimize for Pentium 4 or Athlon

GN>>Может быть, лучше проверять ключик /arch:SSE2 ?
GN>>При этом _M_IX86_FP = 2

SMT>в принципе, в моём проекте (http://sourceforge.net/projects/unrealspeccy) либо оба ключа, G7 и arch:SSE2, либо ни одного. поэтому мне без разницы. вот я и спросил, что попроще


При сборке UnrealSpeccy использую /G7 без /arch:SSE2, поскольку у меня AthlonXP .


Кстати, MSVC7.1 понимает:
unsigned short _byteswap_ushort (
   unsigned short val
);

unsigned long _byteswap_ulong (
   unsigned long val
);
здесь.

а вот
void __cpuid(int* CPUInfo,int InfoType); 
unsigned __int64 __rdtsc(void);

есть только в 8й версии.

rdtsc() можно индайнить:
unsigned __int64 inline rdtsc()
{
    __asm   rdtsc 
}


P.S.
UnrealSpeccy rulez !!!
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: SSE2 в VS2003
От: SMT  
Дата: 04.09.05 16:50
Оценка:
Здравствуйте, gear nuke, Вы писали:


GN>Кстати, MSVC7.1 понимает:

GN>
GN>unsigned short _byteswap_ushort (
GN>   unsigned short val
GN>);

GN>unsigned long _byteswap_ulong (
GN>   unsigned long val
GN>);
GN>
здесь.


_byteswap_ushort/ulong мало того, что не intrinsic, они очень коряво сделаны в stdlib (13 и 5 инструкций)


GN>rdtsc() можно индайнить:

GN>
GN>unsigned __int64 inline rdtsc()
GN>{
GN>    __asm   rdtsc 
GN>}
GN>


rdtsc() не заинлайнился (vc7.1), несмотря на декларацию


GN>При сборке UnrealSpeccy использую /G7 без /arch:SSE2, поскольку у меня AthlonXP .

GN>P.S.
GN>UnrealSpeccy rulez !!!

здесь я такого не ожидал хотя.. немало программистов начинали со спектрума
Re[6]: SSE2 в VS2003
От: SMT  
Дата: 04.09.05 17:25
Оценка:
Здравствуйте, SMT, Вы писали:

SMT>_byteswap_ushort/ulong мало того, что не intrinsic, они очень коряво сделаны в stdlib (13 и 5 инструкций)


мда. если написать

#pragma intrinsic(_byteswap_ulong)
#pragma intrinsic(_byteswap_ushort)

то компилятор сразу умнеет
Re[6]: SSE2 в VS2003
От: gear nuke  
Дата: 04.09.05 17:46
Оценка:
Здравствуйте, SMT, Вы писали:

GN>>MSVC7.1 понимает:

GN>>
GN>>unsigned short _byteswap_ushort (
GN>>   unsigned short val
GN>>);

GN>>unsigned long _byteswap_ulong (
GN>>   unsigned long val
GN>>);
GN>>
здесь.


SMT>_byteswap_ushort/ulong мало того, что не intrinsic, они очень коряво сделаны в stdlib (13 и 5 инструкций)


Это можно поправить — указывать ключик /Oi или intrinsic'ом объявлять:
#include <windows.h>
#pragma intrinsic(_byteswap_ulong, _byteswap_ushort)

void start()
{
    volatile unsigned foo = 0x1234567;
    foo = _byteswap_ulong(foo);
        
    volatile unsigned short bar = 0x1234;
    bar = _byteswap_ushort(bar);
}

Компилирую без каких-либо ключей оптимизации:
?start@@YAXXZ PROC NEAR                 ; start
; Line 5
    push    ebp
    mov ebp, esp
    sub esp, 8
; Line 6
    mov DWORD PTR _foo$[ebp], 19088743      ; 01234567H
; Line 7
    mov eax, DWORD PTR _foo$[ebp]
    bswap   eax
    mov DWORD PTR _foo$[ebp], eax
; Line 9
    mov WORD PTR _bar$[ebp], 4660       ; 00001234H
; Line 10
    mov cx, WORD PTR _bar$[ebp]
    mov dh, cl
    mov dl, ch
    mov WORD PTR _bar$[ebp], dx
; Line 11
    mov esp, ebp
    pop ebp
    ret 0
?start@@YAXXZ ENDP                  ; start

GN>>rdtsc() можно инлайнить:
GN>>
GN>>unsigned __int64 inline rdtsc()
GN>>{
GN>>    __asm   rdtsc 
GN>>}
GN>>

SMT>rdtsc() не заинлайнился (vc7.1), несмотря на декларацию

Упс, мой косяк . Часто забываю про __forceinline, поскольку для совместимости делаю так:
#ifdef  _MSC_VER
#define inline __forceinline
#endif
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.