Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

223
Visualizações
PCIe - DMA: memoria consistente frente a transmisión

Actualmente estoy agregando DMA a mi controlador PCIe para Linux. Mientras leo la documentación, menciona la memoria consistente o coherente mediante el uso de la API:

 pci_set_consistent_dma_mask(...)

pero nunca habla realmente sobre por qué usarlo o qué hace. Parece mencionar llamar a la función para mejores prácticas y pruebas futuras. Lo mejor que puedo deducir es que la memoria DMA consistente no tiene efectos de caché y la memoria se escribe entre el dispositivo (FPGA) y la CPU sin ninguna intervención de software/controlador una vez configurada correctamente (suponiendo que leo correctamente). Entonces mis preguntas son:

  1. Suponiendo que un dispositivo PCIe no requiere una memoria consistente, ¿por qué alguien lo usaría o en qué casos se usa una memoria consistente?
  2. Si uso memoria consistente, ¿ no necesito implementar una interrupción en el controlador PCIe para DMA? Si es verdadero, ¿cómo saben el dispositivo y el código de acceso del usuario que se ha producido una transferencia?
  3. Si transfiero muchos paquetes pequeños, ~ 50 bytes, de forma continua y, en ocasiones, paquetes más grandes, ~ 6 kB, ¿qué memoria DMA es mejor: consistente o de transmisión?
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Piénselo de esta manera: "Consistente" significa que será automáticamente coherente entre la CPU y el bus sin hacer nada para sincronizarlo específicamente . Por ejemplo, supongamos que tengo un anillo de memoria para paquetes entrantes y salientes. Su vida útil será todo el tiempo que el sistema esté en uso, y voy a estar revisándolo todo el tiempo. Quiero que esto sea siempre consistente, porque si no lo es, tendría que vaciar o sincronizar (manualmente) los cachés, y si esto fuera costoso, y tuviera que hacerlo justo cuando toqué el anillo, sería una pesadilla. .

Por otro lado, tomemos un solo búfer de datos que estoy transfiriendo. No soy una especie de trato "único". Puedo dejar que el dispositivo lo transfiera, y tal vez se necesiten muchos ciclos de PCI para completar el DMA. Y tal vez esto es inconsistente . Está bien, pero cuando termine , puedo vaciar/sincronizar cachés/forzar la consistencia. Si me tomó un poco de tiempo extra hacerlo, no hay problema, porque solo lo estoy haciendo una vez .

Por lo tanto, podría preguntarse "¿por qué no hacer que todo sea coherente?". La respuesta es que generalmente hay algún nivel de gastos generales para que las cosas sean consistentes. Dependiendo de la arquitectura, esto podría ser significativo. Entonces, en tales casos, existen disposiciones para permitir asignaciones inconsistentes (transmisión) que no tienen coherencia de caché (pero requieren una sincronización explícita ). Por lo tanto, permitir una transferencia inconsistente podría mejorar su rendimiento.

Recuerde también: hay algunos casos en los que nunca necesitaría consistencia. Por ejemplo, leer un búfer de un dispositivo de red en la memoria y luego escribir esa memoria en un controlador de disco. Es posible que la CPU nunca lea/utilice estos datos, entonces, ¿por qué molestarse en colocar una sobrecarga en el caché de la CPU para rastrearlos?

En cuanto a tu comentario sobre la "interrupción", esto es un poco extraño. En un caso "normal", es posible que tenga una estructura de control en la memoria consistente (como anillos Tx/Rx) que podría sondear para indicarle si se realizó la transacción. Pero los datos reales transferidos estarían en una memoria diferente que podría transmitirse o no ser consistente.

over 4 years ago · Santiago Trujillo Relatório

0

1) Imagine que desea transferir una gran cantidad de datos a través de PCIE, con una tasa alta. tiene que usar una lista de dispersión/recopilación, y puede usar una memoria consistente para preparar esta lista para FPGA, por lo que FPGA puede leer esta lista muy rápido y luego hacer las transmisiones.

2) Por supuesto que necesita interrupciones, de lo contrario, debe usar el sondeo, que es muy lento y poco confiable.

3) Si usa una memoria consistente más grande, puede minimizar los gastos generales de interrupción / sondeo, por lo que son más rápidos, pero las ventanas generalmente no le permiten asignar una memoria consistente grande.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda