Параллельная обработка в двухъядерном процессоре ARMv7 - PullRequest
0 голосов
/ 09 июня 2018

Я работаю над Zedboard, который содержит двухъядерные процессоры ARM A9 и работает под управлением Linux.Плата связывается с внешним устройством ввода-вывода.

У меня есть две функции, написанные на языке 'C', которые я должен выполнять параллельно.

Одна функция вызывает цикл while и непрерывно выгружает данные на внешнее устройство и получает обработанные данные обратно в указатель памяти.

Другая функция считывает данные из местоположения указателя, создает их копию и выполняет вычислительные процессы (такие как БПФ, выравнивание сигналов и т. Д., Которые выполняются медленно).

Внешнему устройству нужны данныена 15 миллионов образцов в секунду.чего я могу достичь, если я только запускаю первую функцию, и она занимает около 70% одного ядра ARM.Когда я запускаю обе функции, оба ядра ARM достигают своего предела, и я обнаруживаю, что не могу предоставить данные внешнему устройству с требуемой скоростью выборки.

Есть ли способ, которым я могуограничить обе функции в независимых ядрах (не имеет значения, что вторая функция работает медленно, но производительность первой функции не может быть скомпрометирована) и все еще может обмениваться данными между ними?

Я пыталсяиспользуя OpenMP, но он не работал для достижения требуемой производительности.Я читал о SCHED_SETAFFINITY, но у меня была проблема с пониманием его реализации.

Я максимально оптимизировал каждую из своих функций, используя конструкции / библиотеки NEON и функцию автоматической векторизации процессоров ARM.

1 Ответ

0 голосов
/ 09 июня 2018

Вы можете установить каждый отдельный поток в отдельное ядро ​​с помощью:

 int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

На странице руководства:

Описание

Маска сродства ЦП процессаопределяет набор процессоров, на которых он может работать.В многопроцессорной системе установка маски сродства ЦП может быть использована для повышения производительности.Например, выделив один ЦП определенному процессу (т. Е. Установив маску сходства этого процесса для указания одного ЦП и установив маску сходства всех других процессов, чтобы исключить этот ЦП), можно обеспечить максимальную скорость выполнения.для этого процесса.Ограничение запуска процесса на одном процессоре также позволяет избежать снижения производительности, вызванного недействительностью кэша, которая возникает, когда процесс перестает выполняться на одном процессоре, а затем возобновляет выполнение на другом процессоре.

Но есливаш код имеет жесткие отношения данных между входным и выходным потоком, многопоточность может быть медленнее, чем использование одного ядра!Это вряд ли связано с памятью / кешем и особенно на руку на всех мостах между ядром / памятью / кешем и системами внешних шин.Вам также следует поиграть с приоритетом, сродством и, возможно, другими параметрами.

Кстати: «15 миллионов выборок в секунду» и FFT с IO на 1 GHZ Arm с Linux параллельно.Вот Это Да!Горячий материал;)

...