Algunos dispositivos PCIe (por ejemplo, la tarjeta FPGA) pueden exponer segmentos de su memoria física a través de las BAR del host y el host puede acceder a la región de la memoria a través de los dispositivos de memoria (en Linux, podemos asignar la memoria de los dispositivos a la memoria virtual). Supongo que el dispositivo en sí también podría acceder a esta parte de la memoria a través del mecanismo mapeado /dev/mem si también ejecuta Linux.
Una cosa que un programa podría hacer con la memoria (virtual) son operaciones atómicas como "__atomic_sub_fetch" y eso podría ser muy útil al escribir código de alto rendimiento.
Mi pregunta es ¿qué sucede si la memoria proviene de la memoria compartida PCIe anterior (y se asigna al espacio de memoria virtual del usuario)? ¿Sigue siendo válida la operación atómica? No sé si PCIe puede garantizar la atómica considerando que las operaciones atómicas podrían provenir tanto del host como de las CPU del dispositivo al mismo tiempo. En caso afirmativo, ¿cómo se compara su rendimiento con la misma operación atómica en la memoria normal?
He visto una pregunta relacionada aquí, no una respuesta directa. Comprensión básica del mapeo de memoria PCI Express BAR
¡Muchas gracias!
OP Pregunta 1: Mi pregunta es ¿qué sucede si la memoria proviene de la memoria compartida PCIe anterior (y asignada al espacio de memoria virtual del usuario)? ¿Sigue siendo válida la operación atómica?
Sí. Tanto el software host de FPGA como el de CPU pueden solicitar un bloqueo para acceso exclusivo a una región de memoria para realizar operaciones atómicas . Por ejemplo, la memoria virtual compartida (SVM) de OpenCL presenta una sincronización detallada entre el dispositivo y el host, lo que permite que el host y el dispositivo accedan a las estructuras de datos compartidas al mismo tiempo y se sincronicen con la granularidad de las instrucciones atómicas de carga/almacenamiento. Esto permite una verdadera concurrencia entre hilos de software y núcleos FPGA en presencia de estructuras de datos compartidas.
Habiendo dicho eso, dicha sincronización para el acceso simultáneo a la memoria a través de operaciones atómicas de carga/almacenamiento requiere un mecanismo para garantizar que el acceso del kernel/acelerador de hardware de CPU o FPGA a los datos compartidos esté protegido contra un acceso de interferencia a la misma ubicación por parte del otro lado hasta que el el acceso ha sido completado ( atomicidad del acceso).
Además, la respuesta en SO aquí dice que PCIe 3.0 admite ciertas "Transacciones bloqueadas".
Además, dado que su pregunta menciona FPGA, tomemos un ejemplo concreto. También puede comprender la operación atómica para el bloque integrado de FPGA de la serie 7 para PCI Express v3.3 . Menciona que el bloque integrado de FPGA de la serie 7 para PCI Express admite operaciones atómicas de envío y recepción (Operaciones atómicas ) como se define en la Especificación básica de PCI Express v2.1. La especificación define tres tipos de TLP que permiten mecanismos avanzados de sincronización entre múltiples productores y/o consumidores. El bloque integrado trata los TLP de operaciones atómicas como transacciones de memoria no publicadas. Los tres tipos de TLP son:
OP Pregunta 2: En caso afirmativo, ¿cómo se compara su rendimiento con la misma operación atómica en la memoria normal?
esto depende Uno de los factores significativos es también el tamaño de los datos. Por ejemplo, en algunas aplicaciones, la misma operación atómica puede funcionar mejor en un sistema de memoria regular si el tamaño de la matriz es pequeño. Por otro lado, la misma operación atómica puede ser mejor para SVM con arreglos de mayor tamaño. A veces, en el caso de que SVM logre un rendimiento de tiempo de ejecución igual al de la memoria normal, también se puede considerar una ganancia de rendimiento, ya que SVM en sí mismo tiene gastos generales.
Creo que la respuesta es "No".
Las operaciones atómicas como __atomic_fetch_add se implementan (en x86) como una instrucción con un prefijo LOCK . Este prefijo tradicionalmente le diría a la CPU que "bloquee" el bus mediante la afirmación de una señal LOCK# que otras CPU físicas respetarían. Hoy en día, esta atomicidad es manejada por el protocolo de coherencia de caché ( MESI ), que dicta el comportamiento de la jerarquía de caché.
Consulte ¿Qué es la señal de bloqueo del procesador # y cómo funciona? .
El punto es que estas instrucciones de la CPU solo protegen la memoria contra otras CPU .
Por lo tanto, es posible que pueda usar instrucciones atómicas para proporcionar atomicidad desde la perspectiva del software que se ejecuta en otros núcleos de CPU, pero que yo sepa, no hay primitivas atómicas disponibles en el protocolo PCIe que proporcionen atomicidad contra el dispositivo en sí .
Ver: http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1
Editar: En realidad, podría estar equivocado. Esta respuesta dice que PCIe 3.0 admite ciertas "Transacciones bloqueadas". Pero no estoy seguro de que una CPU x86 traduzca una instrucción lock inc contra una dirección PCIe asignada en memoria a una instrucción PCIe FetchAdd . Me interesaría mucho escuchar más información aquí.