Параллельная обработка в двухъядерном процессоре ARMv7

c multithreading performance parallel-processing neon

162 просмотра

1 ответ

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

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

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

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

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

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

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

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

Автор: Sushant S Samuel Источник Размещён: 28.07.2019 05:34

Ответы (1)


2 плюса

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

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

Со страницы руководства:

Описание

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

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

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

Автор: Klaus Размещён: 09.06.2018 12:52
Вопросы из категории :
32x32