tabla hash upmem

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.

    upmem_PIM_chip

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.

    MRAM
    • Los programas DPU son de uso gratuito DPU_MRAM_HEAP_POINTERdesde 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()Ambos dpu_launch()implican llamadas al sistema y tienen muchos gastos generales.
    • Procesar una solicitud por lotes cada vez
  • 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()y mram_read()mejore la eficiencia de transferencia.

Supongo que te gusta

Origin blog.csdn.net/qq_49588762/article/details/126919480
Recomendado
Clasificación