Я передаю данные из 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
Измерение производительности, которое вы даете, показывает, что проблема не имеет никакого отношения к DMA или потокам. Что медленно, так это преобразование двоичных данных в строковые.
Не удивительно, так как Cost iostreams очень медленно а также даже функции C stdio значительно неоптимальны
Используйте оптимизированную функцию для преобразования чисел в строки, и ваш 15-секундный интервал для записи текстового файла станет намного ближе к тому 0,5-кратному времени, который у вас есть для двоичного файла. Я бы ожидал 1,0 секунды или меньше, от этого единственного изменения.
Других решений пока нет …