arquitectura de diseño upmem
upmem es un chip de memoria PIM (procesamiento en memoria).
-
20 DIMM.
El servidor Intel tiene 20 DIMM y un DIMM es un módulo UPMEM.
-
Cada UPMEM PIM DIMM contiene 128 DPU
Cada módulo UPMEM contiene 128 DPU, es decir, 128 procesadores.
-
Cada DPU contiene 64 MB de MRAM, 24 KB de IRAM y 64 KB de WRAM.
Cada DPU contiene 24 KB de IRAM, 64 KB de WRAM y 64 MB de MRAM. IRAM es el caché de instrucciones; WRAM es la memoria de ejecución del programa. Aquí es donde se colocan las pilas, variables globales, etc. según un esquema predefinido; la MRAM se considera un "periférico externo" y cada acceso a una variable MRAM implica una transferencia de MRAM.
-
La DPU es un procesador RISC de 32 bits y 24 subprocesos.
El procesador de la DPU es un procesador de 24 subprocesos y cada DPU tiene 24 subprocesos disponibles.
programación upmem
Lea detalladamente la documentación del sitio web oficial de upmem .
diseño de tabla hash upmem
-
Arquitectura general
-
Almacenar particiones de depósitos en la DPU
Dividimos los depósitos en DPU individuales. DPU0 almacena depósitos[0] ~cubos[HT_SIZE_PER_PDU-1], DPU1 almacena depósitos[HT_SIZE_PER_PDU] ~cubos[2*HT_SIZE_PER_PDU-1]……
-
Almacenar metadatos en la caché del host
Algunos metadatos de Hashtale se almacenan en Host DRAM, como la cantidad de DPU asignadas y la cantidad de depósitos almacenados en cada DPU. Distribuya las solicitudes a procesar a cada DPU mediante HashFunction.
-
Procesar una solicitud por lotes cada vez
Debido a que el host llama a la DPU para procesar la solicitud, hay llamadas al sistema involucradas y la sobrecarga es relativamente alta. Elegimos procesar un lote de solicitudes cada vez.
-
-
El proceso de agregar, eliminar, modificar y verificar.
Después de que Hashtable reciba la solicitud, primero, use HashFunction para calcular el índice de depósito; calcule la DPU y el ID de depósito correspondientes a la solicitud a través del índice de depósito y los metadatos; transfiera el contenido de la solicitud a la DPU correspondiente; ejecute la DPU, la DPU analiza la solicitud y agrega, elimina, verifica y modifica la Operación; finalmente, el Host obtiene el resultado del procesamiento de la DPU.
El siguiente es el pseudocódigo del proceso de agregar, eliminar, verificar y modificar:
index = HashFunction(key); dpu = index / HT_SIZE_PER_PDU; // 获取操作dpu_id bucket = index % HT_SIZE_PER_PDU; // 获取对应dpu中bucket_id dpu_push_xfer(dpu_set, DPU_XFER_TO_DPU, request); // 传输请求内容 dpu_launch(dpu_set, DPU_SYNCHRONOUS); // 运行dpu dpu_push_xfer(dpu_set, DPU_XFER_FROM_DPU, response); // 获取response
-
MRAM_asignador
MRAM_allocator es un asignador de memoria lineal diseñado para MRAM.
-
Los programas DPU son de uso gratuito
DPU_MRAM_HEAP_POINTER
desde MRAM hasta el final.La biblioteca de tiempo de ejecución UPMEM DPU administra la memoria de MRAM: MRAM se divide en dos partes, 0 a PU_MRAM_HEAP_POINTER son utilizadas por las variables MRAM, el tamaño es 1 MB; la parte desde DPU_MRAM_HEAP_POINTER hasta el final es utilizada libremente por el programa DPU, y el tamaño es de 63 MB.
-
Diseñamos un asignador de memoria lineal para gestionar la parte discrecional de MRAM.
La parte desde DPU_MRAM_HEAP_POINTER hasta el final puede considerarse como memoria sin procesar y diseñamos un asignador de memoria lineal para administrarla.
-
La asignación de memoria debe cumplir con una alineación de 8 bytes para facilitar las transferencias DMA.
-
código fuente de tabla hash upmem
El código se ha subido a github .
optimización de tabla hash upmem
Presentamos algunas sugerencias de optimización e implementaremos estas optimizaciones en versiones posteriores de upmem-hashtable.
- concurrencia
- Cada DPU puede utilizar 24 subprocesos y se requieren más de 12 subprocesos para lograr el rendimiento completo
- Para operaciones de consulta, consultas simultáneas directas.
- Para operaciones de adición, eliminación y modificación, se requiere bloqueo sincrónico.
- Evite la interacción frecuente entre DPU y CPU
- El uso
dpu_push_xfer()
de transmisión paralela puede mejorar la eficiencia de la transmisión. dpu_push_xfer()
Ambosdpu_launch()
implican llamadas al sistema y tienen muchos gastos generales.- Procesar una solicitud por lotes cada vez
- El uso
- MRAM_asignador
- Diseño de un asignador de memoria dinámica
- Transferencia de datos entre WRAM y MRAM
- Para cadenas más grandes, adopte
mram_write()
ymram_read()
mejore la eficiencia de transferencia.
- Para cadenas más grandes, adopte