2009-06-03 9 views
10

Necesito una sugerencia sobre cómo copiar un bloque de memoria de manera eficiente, en un solo intento si es posible, en lenguaje C++ o en ensamblador.copia del bloque de memoria

Tengo un puntero a la ubicación y el desplazamiento de la memoria. Piensa en una memoria como una matriz 2D que necesito copiar consistente en filas y columnas.

Respuesta

4

Si necesita implementar dicha funcionalidad usted mismo, le sugiero que compruebe Duff's Device si debe hacerse de manera eficiente.

+0

Bueno, tu respuesta me ayudó a ahorrar unos pocos milisegundos. –

38

¿Qué tal std::memcpy?    

+0

Sí, use memcpy, ya que generalmente es óptimo para la arquitectura de destino. En las arquitecturas x86, las implementaciones óptimas usan unos pocos registros SSE de 128 bits. –

+0

bueno, ya lo había intentado. Lo que hace Memcopy es que copia una fila a la vez. Pienso que tengo un bloque que consta de 5000 filas o más y en una función que se llama todo el tiempo 10000 veces. –

+2

Si todas las filas son contiguas en la memoria, puede copiar todas las filas en una sola llamada memcpy. Si las brechas entre las filas en la memoria son pequeñas, una única llamada memcpy probablemente sea la más rápida. Si todas las filas se asignan por separado, se necesitará un bucle de memcpy. –

2

Al leer sus comentarios, parece que podría querer usar el paralelismo. Hay instrucciones para hacer esto, pero solo operan en registros, no en memoria.

Esto se debe a la forma en que la arquitectura de la computadora es (supongo x86).

Solo puede acceder a una ubicación de memoria a la vez porque la computadora solo tiene un bus de direcciones. Si intenta acceder a más de una ubicación a la vez, estaría sobrecargando el autobús y nada funcionaría correctamente.

Si puede colocar los datos que necesita en los registros, puede usar muchas instrucciones interesantes del procesador, como MMX o SSE, para realizar cálculos paralelos. Pero en cuanto a la copia de memoria en paralelo, no es posible.

Como han dicho otros, use memcpy. Es confiable, depurado y rápido.

0

¿REP MOVSD en el montaje quizás? Difícil de decir sin más información sobre exactamente lo que está tratando de copiar ... O bien, puede reprogramar el controlador DMA para que lo haga también, pero en realidad terminará siendo más lento que solo usar el procesador. :-)

1

Use memmove() si el origen y la fuente se superponen. Por lo general, memcpy() y memmove() ya se han optimizado en gran medida para el clib de su compilador. Si escribes un reemplazo, al menos compara con las versiones clib para asegurarte de que no estás ralentizando tu código.

Tengo un bloque compuesto por 5000 filas o más y en una función que se llama todo el tiempo 10000 veces

También, considere cambiar su estructura de datos. Tal vez en lugar de una matriz 2D, puede tener una matriz 1D de punteros a matrices secundarias (las columnas). Luego, en lugar de copiar las filas enteras, solo necesita copiar o mover los Punteros. Puede agrupar las matrices de columna en una lista libre para que no pase mucho tiempo asignándolas y liberándolas también.

Cuestiones relacionadas