# ¿tiene mi athlon64 sse3?

## pacho2

Hasta ahora he pensado que no, ya que es un Athlon64 3200+ Winchester. Pero la salida de mi /proc/cpuinfo es la siguiente:

```

processor       : 0

vendor_id       : AuthenticAMD

cpu family      : 15

model           : 47

model name      : AMD Athlon(tm) 64 Processor 3200+

stepping        : 0

cpu MHz         : 1000.000

cache size      : 512 KB

fpu             : yes

fpu_exception   : yes

cpuid level     : 1

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm

bogomips        : 2406.56

TLB size        : 1024 4K pages

clflush size    : 64

cache_alignment : 64

address sizes   : 40 bits physical, 48 bits virtual

power management: ts fid vid ttp tm stc

```

Según http://gentoo-wiki.com/Safe_CFLAGS#Athlon_64_X2_.28AMD.29 he de buscar pni, y lo curioso es que lo tengo   :Shocked: 

¿existe otra forma de saber si tiene o no soporte para SSE3 mi procesador?

Saludos y gracias por la información

----------

## gringo

https://forums.gentoo.org/viewtopic-p-2837452.html#2837452

saluetes  :Wink: 

----------

## pacho2

Muchas gracias

Voy a echarle un vistazo

Saludos  :Smile: 

----------

## pacho2

He salvado el código posteado en ese link como test_pni.c:

```

#include <stdint.h>

uint8_t __attribute__((aligned(64))) current[64];

uint8_t previous[64];

int main()

{

int i;

uint64_t result;

uint32_t _eax, _ebx, _ecx, _edx;

uint8_t _cpuid[13];

uint32_t *_cpuid0 = (uint32_t*) _cpuid;

uint32_t *_cpuid1 = (uint32_t*) ( _cpuid + 4 );

uint32_t *_cpuid2 = (uint32_t*) ( _cpuid + 8 );

uint8_t *ptr0 = current;

uint8_t *ptr1 = previous;

__asm__ __volatile__ (

"cpuid\n"

: "=a" (_eax),

"=b" (*_cpuid0), "=d" (*_cpuid1), "=c" (*_cpuid2)

: "a" (0) );

_cpuid[12] = 0;

printf( "cpuid(0) returns %d (%s)\n", _eax, _cpuid );

__asm__ __volatile__ (

"cpuid\n"

: "=a" (_eax), "=b" (_ebx), "=c" (_ecx), "=d" (_edx)

: "a" (1) );

printf( "cpuid(1) returns %08x %08x %08x %08x\n",

_eax, _ebx, _ecx, _edx );

memset( current, 0xaa, 64 );

memset( previous, 0x55, 64 );

for( i = 0; i < 4; i ++ ) {

__asm__ __volatile__ (

"movdqa %0, %%xmm0\n"

"movdqu %1, %%xmm1\n"

"psadbw %%xmm1, %%xmm0\n"

"paddw %%xmm0, %%xmm2\n"

"haddps %%xmm2, %%xmm2\n"

"haddps %%xmm2, %%xmm2\n"

: : "m" (*ptr0),

"m" (*ptr1) : "xmm0", "xmm1", "xmm2" );

ptr0 += 16;

ptr1 += 16;

}

__asm__ __volatile__ (

"movq %%xmm2, %0\n"

: "=m" (result) );

printf( "Result is %llu\n", result );

}

```

Al ejecutarlo me dice:

```
bash: ./test_pni.o: cannot execute binary file
```

De lo cual deduzco que no tengo SSE3   :Sad: 

Saludos y gracias

----------

## Ferdy

De lo cual deduzco que no has compilado bien el fichero. Intuyo que diría 'Illegal instruction' en caso de que no lo tuvieras.

- ferdy

----------

## pacho2

¿cómo debería compilarlo?

He ejecutado lo siguiente:

```

gcc -c test_pni.c

```

Y luego:

```
sh test_pni.o

test_pni.o: test_pni.o: cannot execute binary file

```

Saludos y gracias por la información  :Smile: 

----------

## Stolz

```
# gcc -Wall test_pni.c -o test_pni  

# ./test_pni  
```

Si no recuerdo mal, los primeros K8 que tenian sse3 eran el Venice y el San Diego.

----------

## Ferdy

Puedes leer la documentación de gcc y compilarlo como lo comenta Stolz o utilizar make (y sus reglas implícitas):

```
make test_pni
```

- ferdy

----------

## pacho2

Muchas gracias, lo he compilado como me ha dicho Stolz y el resultado de ejecutarlo ha sido:

```

./test_pni

cpuid(0) returns 1 (AuthenticAMD)

cpuid(1) returns 00020ff0 00000800 00000001 078bfbff

Result is 496498219533200

```

¿Tengo SSE3?   :Shocked:   Vaya, juraría que es un Winchester, pero parece que tendría sse3 

A ferdy también agradecerle la anotación sobre make, no sabía que lo hiciese él sólo   :Very Happy: 

Saludos  :Smile: 

___________

He probado con el de https://forums.gentoo.org/viewtopic-t-329949-highlight-testpni.html y me da el mismo resultado   :Very Happy: 

----------

## Noss

A ver si tu amd es un core venice tienes ss3, sino no, no le des más vueltas

Solo los venice o superiores incluyen el ss3

un saludo!

----------

## pacho2

Lo que pasa es que aunque me lo vendieron como Winchester, debió ser un Venice (haber cuando lo abro  :Wink: )

Saludos  :Smile: 

----------

## ekz

Pacho2 , desde que vi este hilo quede con la duda de que athlon64 era el mío, investigué y es un venice (con sse3  :Very Happy:  ) pero al igual que a ti en el proc no dice eso...hice la prueba y me arroja los mismos resultados que a ti  :Very Happy: 

Ahora la pregunta: ¿Qué agregaste en tu make.conf?

----------

## kropotkin

 *-ekz3me- wrote:*   

> Pacho2 , desde que vi este hilo quede con la duda de que athlon64 era el mío, investigué y es un venice (con sse3  ) pero al igual que a ti en el proc no dice eso...hice la prueba y me arroja los mismos resultados que a ti 
> 
> Ahora la pregunta: ¿Qué agregaste en tu make.conf?

 

al hacer el cat /proc/pcuinfo si aparece en sis flags "pni" es porque tiene sse3, 

sse3= pni, eso es lo que lei por hay en alguna parte del foro gringo, saludos.

----------

## pacho2

agregué -msse3  :Wink: 

mis CFLAGS son:

-march=k8 -O2 -pipe -msse3

Saludos

----------

## Noss

 *pacho2 wrote:*   

> agregué -msse3 
> 
> mis CFLAGS son:
> 
> -march=k8 -O2 -pipe -msse3
> ...

 

pero no se da por omisión esas flags para los procesadores que ya tienen ss3? por cierto ya se puede poner ss4 para los conroe?

un saludo

----------

## pacho2

 *Noss wrote:*   

>  *pacho2 wrote:*   agregué -msse3 
> 
> mis CFLAGS son:
> 
> -march=k8 -O2 -pipe -msse3
> ...

 

Justo el SSE3 no, ya que no todos los x86-64 las incluyen. Hasta sse2 no tienes que poner nada, ya lo incluye él, pero de ahí en adelante sí  :Wink: 

----------

## kropotkin

 *pacho2 wrote:*   

>  *Noss wrote:*    *pacho2 wrote:*   agregué -msse3 
> 
> mis CFLAGS son:
> 
> -march=k8 -O2 -pipe -msse3
> ...

 

exacto yo tengo un amd64 sin sse3   :Crying or Very sad: 

----------

## Noss

Hola!

Supongamos que no he puesto el msse3 ni el msse4, y tengo todo un sistema ya instalado, si lo cambio en el make.conf y las añado, hay alguna manera de que los programas que sacan parditos de ss3 y ss4 se reemerjan yu las use? Digo por si me libro de tener que reemerger todo el sistema solo por dar soporte a ss3 y ss4

Otra cosa, al igual que existe flags para sse sse2 sse3 y sse4, existen tambien uses específicas para esos programas? Quizás añadiendo esas uses al make.conf y haciendo emerge --newuse world tenga todo solucionado

un saludo

----------

## pacho2

 *Noss wrote:*   

> Hola!
> 
> Supongamos que no he puesto el msse3 ni el msse4, y tengo todo un sistema ya instalado, si lo cambio en el make.conf y las añado, hay alguna manera de que los programas que sacan parditos de ss3 y ss4 se reemerjan yu las use? Digo por si me libro de tener que reemerger todo el sistema solo por dar soporte a ss3 y ss4
> 
> Otra cosa, al igual que existe flags para sse sse2 sse3 y sse4, existen tambien uses específicas para esos programas? Quizás añadiendo esas uses al make.conf y haciendo emerge --newuse world tenga todo solucionado
> ...

 

En el manual de gcc 4.1.1 no he visto nada relacionado con sse4. Por no usar sse3 no vas a sufrir nada, yo no lo estoy empezando a usar hasta ahora. Si lo añades en el /etc/make.conf (en tus CFLAGS), sólo lo que se compile a partir de ese momento se compilará con el sse3. El --newuse sólo afecta a las USEs, no a los CFLAGS (no hay USE sse3, hay USE "sse"  :Wink: ). Reemergiendo con la USE sse los programas que la usen, te asgeuras de que la van a emplear los programas que de verdad van a sacar partido a sse (como gimp).

Yo en concreto he preguntado lo del SSE3 precisamente ahora porque sabía que tenía que recompilar todo el sistema para hacer una transición completa a gcc4 (así mato dos pajaros de un tiro).

Saludos

----------

## Noss

 *pacho2 wrote:*   

>  *Noss wrote:*   Hola!
> 
> Supongamos que no he puesto el msse3 ni el msse4, y tengo todo un sistema ya instalado, si lo cambio en el make.conf y las añado, hay alguna manera de que los programas que sacan parditos de ss3 y ss4 se reemerjan yu las use? Digo por si me libro de tener que reemerger todo el sistema solo por dar soporte a ss3 y ss4
> 
> Otra cosa, al igual que existe flags para sse sse2 sse3 y sse4, existen tambien uses específicas para esos programas? Quizás añadiendo esas uses al make.conf y haciendo emerge --newuse world tenga todo solucionado
> ...

 

Me da a mi que al poner nocona cmo máquina la use sse se da ya por defecto... porque ahora la he añadido he intentado hacer el emerge -uDv --newuse world y no ha emergido nada

un saudo!

----------

## Ferdy

¿Quizá porque --newuse y CFLAGS no tienen nada que ver?

- ferdy

----------

## pacho2

 *Noss wrote:*   

>  *pacho2 wrote:*    *Noss wrote:*   Hola!
> 
> Supongamos que no he puesto el msse3 ni el msse4, y tengo todo un sistema ya instalado, si lo cambio en el make.conf y las añado, hay alguna manera de que los programas que sacan parditos de ss3 y ss4 se reemerjan yu las use? Digo por si me libro de tener que reemerger todo el sistema solo por dar soporte a ss3 y ss4
> 
> Otra cosa, al igual que existe flags para sse sse2 sse3 y sse4, existen tambien uses específicas para esos programas? Quizás añadiendo esas uses al make.conf y haciendo emerge --newuse world tenga todo solucionado
> ...

 

Porque la USE sse ya la tenías añadida, pero la USE sse no es lo mismo que el CFLAG=-msse3  :Wink: 

Saludos  :Smile: 

----------

