¿Cuál es la mejor manera de cargar 2 valores de 64 bits no alineados en un registro sse con SSSE3?

Hay 2 punteros para 2 fragmentos de 8 bytes no alineados que se cargarán en un registro xmm. Si es posible, utilice intrínsecos. Y si es posible, sin utilizar un registro auxiliar. Sin pinsrd. (SSSE Core 2)

preguntado el 27 de agosto de 11 a las 23:08

¿Los valores de 64 bits son contiguos en la memoria? ¿O están esparcidos? -

2 Respuestas

Desde el msvc especificaciones, parece que puede hacer lo siguiente:

__m128d xx;                   // an uninitialised xmm register 
xx = _mm_loadh_pd(xx, ptra);  // load the higher 64 bits from (unaligned) ptra
xx = _mm_loadl_pd(xx, ptrb);  // load the lower 64 bits from (unaligned) ptrb

La carga desde un almacenamiento no alineado (en mi experiencia) es mucho más lenta que la carga desde punteros alineados, por lo que no querrá realizar este tipo de operación con demasiada frecuencia, si realmente desea un mayor rendimiento.

Espero que esto ayude.

Respondido 28 ago 11, 03:08

Gracias. No sabía los que admitían el acceso no alineado. Gracias por el enlace también, muy informativo. - Alecco

Tal vez sería mejor tener un _mm_load_sd (ptrb) y luego _mm_loadh_pd (... ptra) para evitar una dependencia para la primera carga. (gcc lo cambia a movsd) - Alecco

@alecco: Sí, podría ser. Esta podría perder el tiempo estableciendo el más alto 64 bits a cero, no estoy seguro - tendrías que comparar ... - Darren Engwirda

El acceso no alineado es mucho más lento que el acceso alineado (al menos antes de Nehalem); puede obtener una mayor velocidad cargando las palabras alineadas de 128 bits que contienen las palabras deseadas de 64 bits sin alinear, y luego barajándolas para obtener el resultado que desea.

Asume:

  • tiene acceso de lectura de memoria a las 128 palabras completas
  • las palabras de 64 bits están alineadas en al menos límites de 32 bits

p. ej. (no probado)

int aoff = ptra & 15;
int boff = ptrb & 15;
__m128 va = _mm_load_ps( (char*)ptra - aoff ); 
__m128 vb = _mm_load_ps( (char*)ptrb - boff ); 

switch ( (aoff<<4) | boff ) 
{
    case 0:  _mm_shuffle_ps(va,vb, ...

El número de casos depende de si puede asumir una alineación de 64 bits

Respondido 30 ago 11, 18:08

Sí, DarkShikari tiene una publicación interesante sobre esto. Pero consumiría demasiados registros para este código específico. ¡Gracias! - Alecco

¿Alguna idea de si esto ha sido una victoria en la práctica? Busqué en Google esta idea y terminé aquí :) - Joseph Garvin

No puedo evitar sentir que estás accediendo a la memoria fuera del rango señalado por ptra y ptrb. Si esos punteros son direcciones de montón, entonces no hay garantía de que haya una página que respalde la lectura insuficiente o excesiva. - jww

@jww, sí, por eso el "Asume" - Mark Borgerding

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.