2011-05-16 9 views
11

Tengo un vector de columna A que tiene 10 elementos. Tengo una matriz B que es 10 por 10. El almacenamiento de memoria para B es columna principal. Me gustaría sobrescribir la primera fila en B con el vector columna A.¿Hay una versión estándar, strided de memcpy?

Claramente, lo que puedo hacer:

for (int i=0; i < 10; i++) 
{ 
    B[0 + 10 * i] = A[i]; 
} 

donde he dejado el cero en 0 + 10 * i destacar que utiliza la columna B -mayor almacenamiento (cero es el índice de la fila).

Después de algunas travesuras en CUDA-land esta noche, tuve la idea de que podría haber una función de CPU para realizar una memcpy con estrías? Supongo que en un nivel bajo, el rendimiento dependerá de la existencia de una instrucción de carga/almacenamiento con strided, que no recuerdo que haya en el ensamblaje x86.

+0

quizás debería considerar cambiar la estrategia de almacenamiento para esta matriz, o almacenar su transposición. –

Respuesta

8

Respuesta breve: El código que ha escrito es tan rápido como se va a obtener.

Respuesta larga: La función memcpy está escrita utilizando algunos intrínsecos complicados o ensamblajes, ya que opera en operandos de memoria que tienen un tamaño y una alineación arbitrarios. Si está sobreescribiendo una columna de una matriz, entonces sus operandos tendrán una alineación natural, y no necesitarán recurrir a los mismos trucos para obtener una velocidad decente.

+0

Supongo que solo tenía esperanzas de acceso a nivel de ensamblaje para decir instrucciones de carga/almacenamiento sin desvíos para la memoria de doble y triple canal. –

+0

No estoy seguro de lo que quiere decir con operaciones de carga/almacenamiento "sin restricciones". –

+0

Quizás solo una percepción incorrecta de mi parte, pero pensé que el ram de triple canal estaba rayado en el espacio de direcciones. Si pudiera escribir en solo uno de los chips de memoria (escribir solo en un canal a una velocidad más lenta) eso sería el equivalente a un memcpy strided? Esto, por supuesto, dependerá en gran medida de la granularidad de las rayas. –

Cuestiones relacionadas