помогите мне понять cuda

я испытываю некоторые затруднения при понимании потоков в NVIDIA gpu архитектура с cuda.

мог кто-либо разъяснять их информация: 8800 gpu имеют 16 SMS с 8 SPS каждый. таким образом, у нас есть 128 SPS.

я просматривал видеопрезентацию Стэнфорда, и она говорила, что каждый SP способен к выполнению 96 потоков cuncurrently., это означает, что она (SP) может выполнить деформации 96/32=3 одновременно?

кроме того, так как каждый SP может выполнить 96 потоков, и у нас есть 8 SPS в каждом СМ. это означает, что каждый СМ может работать 96*8=768 потоки одновременно?? но если каждый СМ может выполнить единственный Блок за один раз, и максимальное количество потоков в блоке 512, поэтому какова цель выполнить 768 потоков одновременно, и имейте макс. из 512 потоков?

более общим вопросом is:how являются блоки, потоки и деформации, распределенные SMS и SPS? я считал, что каждая SM заставляет единственный блок выполняться за один раз, и потоки в блоке разделен на деформации (32 потока), и SPS выполняет деформации.

16
задан scatman 5 February 2010 в 12:37
поделиться

2 ответа

\( [^ ]\| ^\)\( [^ ]\| $\) найдет одиночные пробелы, только если это то, что вам нужно.

-121--4690810-

Я использую эту программу для выключения компьютера за X минут.

   public class Shutdown {
    public static void main(String[] args) {

        int minutes = Integer.valueOf(args[0]);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                ProcessBuilder processBuilder = new ProcessBuilder("shutdown",
                        "/s");
                try {
                    processBuilder.start();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

        }, minutes * 60 * 1000);

        System.out.println(" Shutting down in " + minutes + " minutes");
    }
 }
-121--909777-

Вы должны просмотреть веб-семинары на веб-сайте NVIDIA, вы можете присоединиться к сеансу в прямом эфире или просмотреть предварительно записанные сеансы. Ниже представлен краткий обзор, но я настоятельно рекомендую вам посмотреть вебинары, они действительно помогут, так как вы можете увидеть диаграммы и объяснить это в то же время.

При выполнении функции (ядра) на графическом процессоре она выполняется как сетка из блоков из потоков .

  • Поток - это наилучшая гранулярность, каждый поток имеет уникальный идентификатор в блоке (threadIdx), который используется для выбора данных для работы. Поток может иметь относительно большое количество регистров, а также частную область памяти, известную как локальная память , которая используется для разлива файла регистра и любых больших автоматических переменных.
  • Блок - это группа потоков, которые выполняются вместе в пакете. Основная причина такого уровня детализации заключается в том, что потоки внутри блока могут взаимодействовать, используя быструю общую память . Каждый блок имеет уникальный идентификатор (blockIdx), который в сочетании с threadIdx используется для выбора данных.
  • Сетка - это набор блоков, которые вместе выполняют операцию графического процессора.

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

GPU состоит из SM, и каждый SM содержит несколько SP. В настоящее время на SM приходится 8 SP и от 1 до 30 SM на GPU, но на самом деле фактическое количество не является серьезной проблемой, пока вы не получите действительно продвинутый.

Первым моментом, который следует учитывать при определении производительности, является деформация . Деформация - это набор из 32 нитей (если в блоке имеется 128 нитей (например), то нити 0-31 будут в одной основе, 32-63 в следующей и так далее. Деформации очень важны по нескольким причинам, наиболее важным является:

  • Нити в пределах основы связаны вместе, если одна нить в пределах основы идет вниз по стороне 'if' блока if-else, а другие идут вниз по 'else', то на самом деле все 32 нити пойдут вниз по обеим сторонам. Функционально нет проблем, те потоки, которые не должны были принять ветвь, отключены, так что вы всегда получите правильный результат, но если обе стороны длинны, то важно штраф производительности.
  • Нити в пределах основы (фактически полуосновы, но если вы получаете ее правильно для деформации, то вы в безопасности на следующем поколении тоже) извлекают данные из памяти вместе,так что если вы можете гарантировать, что все потоки извлекают данные в пределах одного «сегмента», то вы будете платить только одну транзакцию памяти, и если все они извлекают из случайных адресов, то вы заплатите 32 транзакции памяти. Подробнее об этом см. в презентации Advanced CUDA C , но только когда вы будете готовы!
  • Потоки в пределах основы (опять же полуосновы на текущих графических процессорах) совместно получают доступ к общей памяти, и если вы не будете осторожны, у вас будут «банковские конфликты», где потоки должны стоять в очереди друг за другом, чтобы получить доступ к памяти.

Так понимавший, какова деформация, конечный пункт - то, как блоки и сетка нанесены на карту на GPU.

Каждый блок запускается на одном SM и остается там до завершения. Как только он завершит, он уйдет в отставку и на ПЛ может быть запущен еще один блок. Именно это динамическое планирование дает графическим процессорам масштабируемость - если у вас есть один SM, то все блоки выполняются на одном SM в одной большой очереди, если у вас есть 30 SM, то блоки будут планироваться по SM динамически. Таким образом, вы должны убедиться, что при запуске функции графического процессора ваша сетка состоит из большого количества блоков (по крайней мере сотен), чтобы обеспечить ее масштабирование по любому графическому процессору.

Последний момент заключается в том, что SM может выполнять более одного блока в любой данный момент времени. Это объясняет, почему SM может обрабатывать 768 потоков (или более в некоторых графических процессорах), в то время как блок составляет только до 512 потоков (в настоящее время). По существу, если SM имеет доступные ресурсы (регистры и совместно используемая память), то он примет дополнительные блоки (до 8). Электронная таблица Калькулятор занятости (входит в комплект SDK) поможет определить, сколько блоков может быть выполнено в любой момент.

Извините за свалку мозга, смотрите вебинары - будет проще!

57
ответ дан 30 November 2019 в 15:21
поделиться

Сначала это немного сбивает с толку, но полезно знать, что каждый SP выполняет что-то вроде 4-х стороннего SMT - он циклически проходит через 4 потока, выдавая одну инструкцию за такт, с задержкой в ​​4 цикла для каждой инструкции. Вот так получается 32 потока на деформацию, работающую на 8 SP.

Вместо того, чтобы вдаваться в подробности, связанные с деформациями, блоками, потоками и т. Д., Я отсылаю вас к форуму nVidia CUDA , где подобные вопросы возникают регулярно и есть уже несколько хороших объяснений.

2
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: