Как разрабатывать чипы GPU
Chapter 10 Reliability and Fault Tolerance Gpu Design

Глава 10: Надежность и отказоустойчивость в проектировании GPU

По мере того, как GPU становятся все более распространенными в приложениях, связанных с безопасностью, таких как автономные транспортные средства, робототехника и медицинские устройства, обеспечение их надежности и отказоустойчивости становится первостепенной задачей. GPU подвержены различным типам неисправностей и ошибок, которые могут привести к сбоям в системе, повреждению данных или неправильным результатам. В этой главе мы рассмотрим типы неисправностей и ошибок в GPU, схемы обнаружения и исправления ошибок, механизмы контрольных точек и восстановления, а также принципы проектирования для обеспечения надежности и устойчивости.

Типы неисправностей и ошибок в GPU

Неисправности и ошибки в GPU можно классифицировать по нескольким категориям в зависимости от их происхождения, продолжительности и влияния на систему. Понимание этих различных типов неисправностей и ошибок имеет решающее значение для разработки эффективных стратегий смягчения последствий.

Мягкие ошибки

Мягкие ошибки, также известные как временные неисправности, являются временными ошибками, вызванными внешними факторами, такими как космические лучи, альфа-частицы или электромагнитные помехи. Эти ошибки не вызывают постоянного повреждения оборудования и могут быть исправлены путем перезаписи затронутых данных или перезапуска затронутой операции.

Мягкие ошибки могут проявляться в различных частях GPU, таких как:

  1. Триггеры и защелки: Одиночное событие сбоя (SEU) может вызвать изменение состояния триггера или защелки, что приводит к неправильным данным или потоку управления.

  2. Ячейки SRAM: Мягкие ошибки в ячейках SRAM, таких как используемые в кэшах и регистровых файлах, могут повредить хранимые данные.

  3. Ячейки DRAM: Хотя мягкие ошибки в ячейках DRAM встречаются реже, чем в SRAM, они также могут вызывать изменение битов из-за внешних факторов.

На рисунке 10.1 показано влияние мягкой ошибки на триггер.

           Космический луч
               |
               |
               v
        +------------+
        |            |
D ----->|  Триггер   |----> Q
        |            |
        +------------+
               |
               |
               v
```Мягкая ошибка

Рисунок 10.1: Мягкая ошибка, вызванная космическим лучом, поражающим триггер.

Жесткие ошибки

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

Примеры жестких ошибок в GPU включают:

  1. Застрявшие ошибки: Сигнал или элемент памяти постоянно застрял на логическом значении '0' или '1', независимо от входа.

  2. Ошибки замыкания: Две или более сигнальных линий случайно соединены, вызывая короткое замыкание.

  3. Открытые ошибки: Сигнальная линия случайно отключена, вызывая плавающее или неопределенное значение.

  4. Ошибки задержки: Сигнал занимает больше времени, чем ожидалось, для распространения по пути, что приводит к нарушениям синхронизации.

На рисунке 10.2 показан пример застрявшей на 0 ошибки в логическом элементе.

        Застрявшая на 0 ошибка
               |
               |
               v
           +---+
        -->| & |-->
           |   |
        -->|   |
           +---+

Рисунок 10.2: Застрявшая на 0 ошибка в элементе И.

Периодические ошибки

Периодические ошибки - это неисправности, которые возникают спорадически и сложно воспроизводятся последовательно. Эти ошибки могут быть вызваны различными факторами, такими как:

  1. Предельное оборудование: Компоненты, работающие близко к своим предельным значениям, делают их более восприимчивыми к воздействию окружающей среды или старению.

  2. Факторы окружающей среды: Колебания температуры, изменения напряжения или электромагнитные помехи могут вызывать периодические ошибки.

  3. Эффекты старения: По мере старения устройства некоторые компоненты могут становиться более склонными к периодическим сбоям из-за износа или деградации.

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

Скрытая порча данных

Скрытая порча данных (SDC) относится к ошибкам, которые повреждают данные безВот перевод на русский язык с сохранением оригинального кода:

Сбои обнаружения (SDC) возникают, когда ошибки не обнаруживаются аппаратным или программным обеспечением. SDC может привести к неправильным результатам или сбоям системы, которые могут оставаться незамеченными в течение длительного периода времени.

Примеры SDC в GPU включают:

  1. Арифметические ошибки: Неисправности в арифметических блоках, таких как сумматоры или умножители, могут производить неправильные результаты без каких-либо сигналов об ошибках.

  2. Ошибки памяти: Мягкие ошибки или жесткие неисправности в ячейках памяти могут повредить данные, не будучи обнаруженными механизмами проверки ошибок.

  3. Ошибки потока управления: Неисправности в логике управления или декодерах инструкций могут заставить программу отклоняться от ее предполагаемого пути выполнения без вызова каких-либо исключений.

SDC особенно опасен, потому что он может распространяться по системе и влиять на конечный результат без каких-либо видимых симптомов. Обнаружение и смягчение SDC требует сочетания аппаратных и программных методов.

Схемы обнаружения и исправления ошибок

Для смягчения влияния неисправностей и ошибок в GPU были разработаны различные схемы обнаружения и исправления ошибок. Эти схемы направлены на выявление наличия ошибок и, в некоторых случаях, на их исправление для обеспечения правильной работы системы.

Проверка четности

Проверка четности - это простая техника обнаружения ошибок, которая добавляет дополнительный бит (бит четности) к каждому слову данных, чтобы общее количество битов '1' было либо четным (четная четность), либо нечетным (нечетная четность). Проверяя четность слова данных, можно обнаружить одиночные ошибки в битах.

На рисунке 10.3 показан пример проверки четной четности.

    Слово данных: 1011010
    Бит четности:      1
    Передано: 10110101

    Получено:   10110111
    Бит четности:      0
    Ошибка обнаружена!

Рисунок 10.3: Проверка четной четности для обнаружения ошибок.

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

Коды исправления ошибок (ECC)

Коды исправления ошибок (ECC) являютсяВот перевод на русский язык:

Более продвинутые схемы обнаружения и исправления ошибок, которые могут не только обнаруживать ошибки, но и исправлять их. ECC работает путем добавления избыточных битов к слову данных, что позволяет получателю идентифицировать и исправлять ограниченное количество ошибок в битах.

Одна из распространенных схем ECC - это код Single Error Correction, Double Error Detection (SECDED), который может исправлять одиночные ошибки в битах и обнаруживать двойные ошибки в битах. Коды SECDED часто используются в системах памяти, таких как DRAM и кэши, для защиты от мягких ошибок.

На рисунке 10.4 показан пример кода SECDED.

    Слово данных: 1011010
    Биты ECC:      01101
    Передано:     101101001101

    Получено:     101101011101
                         ^
                         |
                     Ошибка в бите

    Исправлено:   101101001101

Рисунок 10.4: Код SECDED для исправления и обнаружения ошибок.

Другие схемы ECC, такие как коды Боуза-Чоудхури-Хоккенгема (BCH) и коды Рида-Соломона, могут исправлять множественные ошибки в битах за счет более высокой избыточности и сложности.

Избыточное выполнение

Избыточное выполнение - это техника, которая выполняет одно и то же вычисление несколько раз, либо на том же оборудовании, либо на разных аппаратных блоках, и сравнивает результаты, чтобы обнаружить ошибки. Если результаты не совпадают, обнаруживается ошибка, и система может предпринять соответствующие действия, такие как повторная попытка вычисления или инициирование процесса восстановления.

Избыточное выполнение может быть реализовано на различных уровнях в GPU:

  1. Избыточность на уровне инструкций: Каждая инструкция выполняется несколько раз, и результаты сравниваются перед записью в регистровый файл или память.

  2. Избыточность на уровне потоков: Несколько потоков выполняют одно и то же вычисление, и их результаты сравниваются, чтобы обнаружить ошибки.

  3. Избыточность на уровне ядра: Все ядро выполняется несколько раз, и окончательные выходные данные сравниваются, чтобы обнаружить ошибки.

На рисунке 10.5 иллюстрируется избыточность на уровне потоков в GPU.

    Поток 0   Поток 1   Поток 2   Поток 3
```Вот перевод на русский язык с сохранением оригинального кода:

|          |          |          |
       v          v          v          v
    +-------+  +-------+  +-------+  +-------+
    | Комп. |  | Комп. |  | Комп. |  | Комп. |
    +-------+  +-------+  +-------+  +-------+
       |          |          |          |
       v          v          v          v
    +------------+------------+------------+
    |          Компаратор                 |
    +------------+------------+------------+
                 |
                 v
            Обнаружение ошибок

Рисунок 10.5: Избыточность на уровне потоков для обнаружения ошибок.

Избыточное выполнение может обнаруживать широкий спектр ошибок, включая мягкие ошибки, жесткие неисправности и SDC. Однако это приводит к увеличению времени выполнения и потребления энергии.

Сторожевые таймеры

Сторожевые таймеры - это аппаратные или программные механизмы, которые контролируют выполнение GPU и обнаруживают, если система становится неотзывчивой или не может завершить задачу в течение указанного времени. Если сторожевой таймер истекает, это указывает на ошибку, и система может инициировать процесс восстановления, такой как сброс GPU или перезапуск затронутой операции.

Сторожевые таймеры могут быть реализованы на различных уровнях в GPU:

  1. Сторожевой таймер на уровне ядра: Контролирует время выполнения каждого ядра и обнаруживает, если ядро не завершается в течение указанного времени.

  2. Сторожевой таймер на уровне потока: Контролирует время выполнения каждого потока и обнаруживает, если поток не завершается в течение указанного времени.

Механизмы контрольных точек и восстановления

Механизмы контрольных точек и восстановления используются для сохранения состояния приложения GPU в регулярные интервалы времени и восстановления состояния в случае сбоя. Периодически сохраняя состояние приложения, система может восстановиться после сбоев, не перезапуская всё вычисление с самого начала.

Механизмы контрольных точек и восстановления могут быть реализованы на разных уровнях в GPU:

  1. Контрольные точки на уровне приложения: Само приложение отвечает заВот перевод на русский язык:

  2. Приложение-уровневое резервное копирование: Приложение само ответственно за сохранение своего состояния через регулярные интервалы времени. Это можно сделать явным сохранением содержимого памяти и регистров в файл контрольной точки.

  3. Резервное копирование на уровне системы: Система выполнения GPU или драйвер отвечают за сохранение состояния приложения. Это можно сделать прозрачно для приложения, без необходимости вносить изменения в код приложения.

  4. Резервное копирование на аппаратном уровне: Сам аппарат GPU предоставляет поддержку для сохранения и восстановления состояния приложения. Это можно сделать с использованием специализированных аппаратных механизмов, таких как энергонезависимая память или специальные регистры.

Рисунок 10.8 иллюстрирует типичный процесс контрольной точки и восстановления.

    Нормальное выполнение
          |
          |
          v
      Контрольная точка
          |
          |
          v
    Нормальное выполнение
          |
          |
          v
       Сбой
          |
          |
          v
        Восстановление
          |
          |
          v
    Нормальное выполнение

Рисунок 10.8: Процесс контрольной точки и восстановления.

Во время нормального выполнения система периодически сохраняет состояние приложения в контрольную точку. Если происходит сбой, система восстанавливает состояние из последней контрольной точки и возобновляет выполнение с этого момента.

Механизмы контрольной точки и восстановления могут помочь повысить надежность и отказоустойчивость приложений GPU, особенно для длительных вычислений. Однако они также вводят накладные расходы в виде занимаемого места на диске и времени выполнения, так как сохранение и восстановление состояния требует дополнительных ресурсов.

Проектирование для надежности и отказоустойчивости

Проектирование GPU для надежности и отказоустойчивости включает в себя сочетание аппаратных и программных методов. Некоторые ключевые принципы и методы проектирования включают:

  1. Обнаружение и исправление ошибок: Включение механизмов обнаружения и исправления ошибок, таких как ECC и проверка четности, на различных уровнях GPU, включая память, кэши и межсоединения.

  2. Избыточность: Использование избыточностиВот перевод на русский язык с сохранением оригинального кода:

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

  1. Контрольная точка и восстановление: Реализация механизмов контрольной точки и восстановления для сохранения состояния приложения и обеспечения восстановления после сбоев.

  2. Изоляция отказов: Проектирование архитектуры GPU для ограничения распространения ошибок и предотвращения распространения неисправностей по всей системе. Этого можно добиться с помощью таких методов, как разделение, изоляция и барьеры для сдерживания ошибок.

  3. Устойчивость программного обеспечения: Разработка программных методов, таких как отказоустойчивость, основанная на алгоритмах (ABFT), которые позволяют приложениям обнаруживать и восстанавливаться от ошибок с помощью избыточности и проверок на уровне программного обеспечения.

  4. Планирование с учетом надежности: Адаптация планирования задач и ресурсов в GPU с учетом характеристик надежности различных компонентов и оптимизация как производительности, так и надежности.

Пример: Планирование с учетом надежности в GPU

Рассмотрим GPU с несколькими ядрами, где некоторые ядра более подвержены ошибкам, чем другие. Планировщик, учитывающий надежность, может назначать критические задачи или задачи с высокими требованиями к надежности на более надежные ядра, в то время как менее критические задачи назначаются на менее надежные ядра.

На рисунке 10.9 иллюстрируется подход к планированию с учетом надежности.

    Очередь задач
    +-------+
    | Задача1 |
    | Задача2 |
    | Задача3 |
    | Задача4 |
    +-------+
        |
        |
        v
    Планировщик с учетом надежности
        |
        |
        v
    +--------+--------+
    | Ядро 1 | Ядро 2 |
    |  (ВН)  |  (НН)  |
    +--------+--------+
    | Задача1 | Задача3 |
    | Задача2 | Задача4 |
    +--------+--------+

Рисунок 10.9: Планирование с учетом надежности в GPU (ВН: Высокая надежность, НН: Низкая надежность).

В этом примере планировщик назначает Задачу1 и Задачу2, которые имеют высокие требования к надежности, на Ядро 1, которое считается более надежным.Вот перевод на русский язык:

Заключение

Надежность и отказоустойчивость являются критически важными аспектами проектирования и эксплуатации GPU, особенно поскольку GPU все чаще используются в приложениях, связанных с обеспечением безопасности. Понимание типов неисправностей и ошибок, которые могут возникать в GPU, а также методов обнаружения, исправления и восстановления после этих неисправностей, имеет решающее значение для проектирования надежных и устойчивых систем на основе GPU.

Схемы обнаружения и исправления ошибок, такие как ECC и проверка четности, играют ключевую роль в выявлении и смягчении мягких ошибок и жестких неисправностей в различных компонентах GPU. Механизмы контрольных точек и восстановления позволяют системе сохранять состояние приложения и восстанавливаться после сбоев, повышая общую устойчивость системы.

Проектирование GPU для обеспечения надежности и устойчивости предполагает комплексный подход, сочетающий аппаратные и программные методы. Избыточность, изоляция неисправностей, устойчивость программного обеспечения и планирование с учетом надежности - это некоторые ключевые методы, которые могут быть использованы для повышения надежности и отказоустойчивости GPU.

По мере развития GPU и появления новых областей их применения, таких как автономные транспортные средства, робототехника и здравоохранение, обеспечение их надежности и устойчивости будет приобретать все большее значение. Новые методы обнаружения и исправления ошибок, создания контрольных точек и восстановления, а также управление ресурсами с учетом надежности будут иметь решающее значение для создания следующего поколения надежных и отказоустойчивых GPU.