многопоточность — преимущества FAST DMA от FPGA с использованием потоков в переполнении стека

Я передаю данные из FPGA PCIe через DMA, что очень быстро. У меня есть 500 данных, каждая из которых состоит из 80000 байт. Следовательно, время получения и сохранения всех 500 данных в .bin-файле составляет 0,5 секунды. Если я сделаю то же самое в файле .txt (что является моей конечной целью), это займет 15 секунд.

Следовательно, теперь я хочу использовать потоки в c ++, где 1 поток (я называю его главным потоком) принимает данные DMA (по одной за раз) и одновременно открывает 500 других потоков (по одному для каждого файла) каждый поток сохранения файла ожидание некоторого события триггера и т. д. (не слишком большая идея, поскольку ЦП по своей природе работает последовательно, что создает проблемы для разработчика ПЛИС, работающего в параллельной области)

Пожалуйста, обратите внимание, что описанный мною случай может быть решением, но мне нужно знать, как его реализовать, если он корректен в ++ ????

дело

Первые данные (через DMA) поступают в главный поток (где глобальная память назначается с помощью malloc ()) -> поток для файла 1 ожидает любого TRIGGER и т. Д., И, как только он получает этот триггер, копирует содержимое памяти в свой собственный Выделенная память и затем начинает сохранение в файле, в то же время он также запускает «главный поток» для увеличения его счетчика и получения следующих данных, и процесс продолжается для всех 500 данных.

Я в основном парень из ПЛИС и с ++ на этом высоком уровне впервые, я настроен, но застрял. действительно в течение двух дней перепутал чтение материалов по потокам (в с ++), в основном начиная с createthreads () и продолжая и продолжая, я думал, что WaitForSingleObject может быть решением, но я не могу понять, как это реализовать …

любая идея была бы заметна. Я не ищу код, я просто ищу способ реализации. Например, те, кто знаком с VHDL, могут знать, что в VHDL мы можем использовать

Код: wait until abc'event and abc = '1';

а что тут делать?

Спасибо
sraza

0

Решение

Измерение производительности, которое вы даете, показывает, что проблема не имеет никакого отношения к DMA или потокам. Что медленно, так это преобразование двоичных данных в строковые.

Не удивительно, так как Cost iostreams очень медленно а также даже функции C stdio значительно неоптимальны

Используйте оптимизированную функцию для преобразования чисел в строки, и ваш 15-секундный интервал для записи текстового файла станет намного ближе к тому 0,5-кратному времени, который у вас есть для двоичного файла. Я бы ожидал 1,0 секунды или меньше, от этого единственного изменения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]