280 likes | 465 Views
Параллельный алгоритм поиска критических путей и циклов в задаче статического временного анализа цифровых схем с последовательностной логикой. Князев Николай , Intel Костас Малинаускас , Intel. Содержание выступления. Основные понятия статического временного анализа
E N D
Параллельный алгоритм поиска критических путей и циклов в задаче статического временного анализа цифровых схем с последовательностной логикой Князев Николай, Intel Костас Малинаускас, Intel
Содержание выступления • Основные понятия статического временного анализа • Актуальные проблемы статического временного анализа • Параллельный алгоритм для комбинационных схем • Параллельный алгоритм для последовательных схем • Результаты
Статический Временной Анализ • Рассматриваются синхронные схемы • Min/max время распространения сигнала • Вычисляются задержки событий • Событие - изменения уровня сигнала на входе или выходе элемента.
Проблемы программных инструментов СВА • Эффективность инструментов СВА ограниченапроизводительностью • Известные алгоритмы • в основном однопоточная реализация • «ленивые» вычисления • инкрементальные подходы
Алгоритмы для комбинационных схем • Параллелизация по уровням • Элементы разбиваются по уровням • Элементы одного уровня обрабатываются параллельно Уровень 3 Уровень 2 Уровень 1 элем. 2 элем. 1 элем. 3 элем. 5 элем. 4
Алгоритмы для комбинационных схем • Асинхронная параллелизация • Счетчик – число входов, где задержки еще не посчитаны • Элемент добавляется в очередь, когда счетчик равен 0 • Элементы с нулевым счетчиком обрабатываются параллельно элем 2. счетчик 1 элем 1. счетчик 0 элем 3. счетчик 1 элем 5. счетчик 2 элем 4. счетчик 1
Алгоритмы для комбинационных схем • Асинхронная параллелизация • После расчета элемента уменьшаются счетчики на всех элементах, входы которых соединены с данным. элем 2. счетчик 0 элем 1. счетчик 0 элем 3. счетчик 0 элем 5. счетчик 1 элем 4. счетчик 0
Алгоритмы для комбинационных схем • Асинхронная параллелизация элем 2. счетчик 0 элем 1. счетчик 0 элем 3. счетчик 0 элем 5. счетчик 0 элем 4. счетчик 0
Алгоритмы для комбинационных схем время время } преимущество асинхронного подхода элем. 5 элем. 4 элем. 4 элем. 5 элем. 2 элем. 3 элем. 2 элем. 3 элем. 1 элем. 1 ядро 2 ядро 2 ядро 1 ядро 1 Параллелизация по уровням Асинхронный подход
Алгоритм для последовательстных схем Входные элементы Начало Есть элементы в очереди? Нет Конец Есть Алгоритм для комбинационных схем Триггеры, с измененными событиями Распространение событий на триггерах Список элементов с новыми событиям на входе
Алгоритм для последовательстных схем Входные элементы Начало Есть элементы в очереди? Нет Конец Есть Алгоритм для комбинационных схем Триггеры, с измененными событиями Распространение событий на триггерах Список элементов с новыми событиям на входе
Алгоритм для последовательстных схем Входные элементы Начало Есть элементы в очереди? Нет Конец Есть Алгоритм для комбинационных схем tbb::parallel_do Триггеры, с измененными событиями Распространение событий на триггерах tbb::parallel_for Список элементов с новыми событиям на входе
Спасибо за внимание! Ваши вопросы?
ПаралелльностьИнкрементальностьПаралелльностьИнкрементальность Проблема: • Инкрементальная загрузка данных, кэши не потоко-безопастны Решение: • Подогрев кэшей, как временное решение • Параллельные быстрые потокобезопастные паттерны для различных типов кэшей Параллельность Инкреметальность
TBB patterns and BKM’s • Basic TBB patterns • parallel_do, parallel_for, concurent_hash_map, concurrent_vector, mutex spin_lock and other • Composite parallel patterns • Concurrent map-based cache load/access • Concurrent map-based “update-if-more” • Concurrent map and vector synchronous update • Static object init and access
Concurrent map-based cache load/access #define ConcurrentMapType tbb::concurrent_hash_map<..> ConcurrentMapType cashConcurrentMap; DataType GetValue(KeyType key) { ConcurrentMapType::accessor ac; if (cashConcurrentMap.insert(ac,key)) { <incremental cache data load etc.> ac->second = data; } else data = ac->second; return data; }
Concurrent map and vector synchronous update pattern #define ConcurrentMapType concurrent_hash_map <KeyType,DataType1> tbb::concurrent_vector <DataType1> vector1; … tbb::concurrent_vector <DataTypeN> vectorN; ConcurrentMapType indexConcurrentMap; void Update (KeyType key, DataType1 data1…DataTypeN dataN) { ConcurrentMapType::accessor ac; if (indexConcurrentMap .insert(ac,key) ) { vector2.push_back( DataType1() ); … vectorN.push_back( DataTypeN() ); ac->second= vector1.push_back(data1) - vector1.begin(); vector2->at[ac->second] = data2; … vectorN->at[ac->second] = dataN; } else <data is already loaded> }
Cone BFS after incremental change • После малого изменения схемы, встает задача быстрого пересчета задержек в схеме • Граф критических путей представляет собой дерево
Incremental BFS on a DAG Start Yes Queue is empty? Done Source stages (with worsened events) No Extract random stage from the queue Evaluate stage (ignore transparencies) Enqueue source stages Initialize fanin counters in the affected cone Get next fanout stage S TBB::parallel_do Is S entered by port with transp. arc to output? Yes No Decrement fanin counter of S Add to latches with updated inputs Enqueue S if counter=0 Last fanout stage? No TBB::parallel_do Yes
Top algorithm Example latch input output latch latch
Top algorithm Example Step 1 - BFS on DAG latch input output latch latch
Top algorithm Example Step 2 - Latch propagation latch output latch input latch
Top algorithm Example Step 5 - BFS on DAG. No events on latches were updated. latch input output latch latch
Top algorithm Example Step 3 - BFS on DAG latch input output latch latch
Top algorithm Example Step 4 - Latch propagation. Loop detected! latch input output latch latch loop