Errores, fallos, preguntas - página 2506

 
Vict:
Justificar

Los registros se miden en bits, no en bytes. Por lo tanto, esta línea se utiliza incorrectamente en el resto del código:

#define  CACHE_LINE_SIZE 64
 
Francuz:

Los registros se miden en bits, no en bytes. Por lo tanto, esta línea se utiliza incorrectamente en el resto del código:

No, estás diciendo algo extraño. No voy a probarlo. Mira la documentación del procesador, lee aquí https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

En x86 las líneas de caché son de 64 bytes

No necesito registros, no hablo de ellos en absoluto.

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict:

No, estás diciendo algo extraño. No voy a probarlo. Mira la documentación del procesador, lee aquí https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

No necesito registros, no hablo de ellos en absoluto.

Hmm... Bien. De todos modos, el caché varía de un modelo a otro. No hay manera de saber su tamaño desde el software. Por eso es una tontería tomarla como guía. Pero todos los procesadores tienen dos tipos de registros y es el tamaño de los registros en lo que se centran los programadores expertos. E incluso esta orientación a los registros no siempre tiene éxito porque entre el programa y el procesador hay un compilador y un sistema operativo.

Además esta línea está calculada incorrectamente y sin registros:

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
 
Francuz:

Hmm... De acuerdo. De todos modos, la caché varía de un procesador a otro. Y no hay manera de saber su tamaño desde el software. Por eso es una tontería guiarse por ella. Pero todos los procesadores tienen dos tipos de registros y es el tamaño de los registros en lo que se centran los programadores expertos. Y ni siquiera la selección del tamaño del registro le salva siempre, porque el compilador y el sistema operativo se sitúan entre el programa y el procesador.

De nuevo, las cosas están evolucionando, cada vez se pone más énfasis en el multithreading, y aquí hay una librería cross std para contarlo todo

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Además, esta línea está mal calculada y no tiene en cuenta los registros:
Tal vez, pero hasta ahora no me has convencido.
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.
 
Vict:

De nuevo no, las cosas están evolucionando, cada vez se pone más énfasis en el multithreading, y aquí tienes - la biblioteca cross std te lo dirá todo

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Tal vez, pero hasta ahora no me has convencido.

No te lo dirá, te lo dirá. Lea atentamente el pliego de condiciones.


Aunque no sé muy bien qué desplazamiento querías, pero es fácil de entender: una dirección absoluta es completamente inútil en los cálculos. ¿Has olvidado que el punto de referencia de la memoria es la dirección de la estructura? ¿Y probablemente querías obtener el desplazamiento de un array en un bloque de memoria de estructura? Y eso es lo que consigue la diferencia entre las direcciones de la estructura y el elemento nulo del array.

 
Artyom Trishkin:

Si no hay ningún valor en el buffer de la barra, debe escribirse explícitamente en el buffer. Es decir, si el valor calculado debe salir al buffer - lo escribimos en el buffer, de lo contrario - escribimos un valor vacío.

Gracias, Artem.

 
Francuz:

Aunque no sé muy bien qué desplazamiento querías, es fácil entender el fallo: una dirección absoluta es completamente inútil en los cálculos. ¿Has olvidado que el punto de referencia de la memoria es la dirección de la estructura? Y probablemente querías obtener el offset de un array en un bloque de memoria de estructura, ¿no? Y esa es la diferencia entre las direcciones de la estructura y el elemento cero del array.

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

Acciones en orden:

1 - obtener la dirección del primer elemento ar[] de la estructura de datos actual.

2. averiguar sus desplazamientos desde el principio de la línea de caché

3. averiguar cuántos bytes hay desde ella hasta el final de la línea de caché

4. averiguar cuántos bytes caben en este espacio hasta el final de la línea de caché.


¿Lo has ejecutado en tu ordenador? ¿Hay alguna diferencia en la velocidad? ¿O sólo soy yo?

 
Vict:

2. averiguar sus desplazamientos desde el inicio de la línea de caché

¿Qué te hace pensar que es una forma de averiguar su desplazamiento?

 
¿Cuál es la causa de esta ralentización?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2019.07.09 11:13

   Data data[];
   
   ArrayResize(data, 32768);

¡Se está produciendo una ralentización de 6x!

 
fxsaber:
¿Para qué sirven estos frenos?
Un array dinámico tiene más comprobaciones, Renat escribió una vez, no encuentro el post, sólo hablando del acceso a los índices, por qué es significativamente más lento que los pluses