Видеокарты GeForce на микроархитектуре Fermi
Fermi GPU микроархитектура, разработанная NVIDIA, как наследник архитектуры Tesla. Fermi используется в обширном списке серий и видеокарт, как для персональных компьютеров, так и ноутбуков. Fermi одна из старейших микроархитектур NVIDIA, может поддерживать DirectX 12.
Начиная с апреля 2018 года компания NVIDIA остановила поддержку видеокарт на микроархитектуре Fermi, поэтому обновления драйверов для игр, включая улучшения производительности, новые функции и исправления ошибок, будут доступны только на графических процессорах серий Kepler, Maxwell и Pascal. Критические обновления безопасности будут доступны на графических процессорах серии Fermi до января 2019 года.
Новый виток архитектуры CUDA
Изначально эта заметка задумывалась только для тех, кто в теме, но на всякий случай поясню что такое compute capability в CUDA.
Итак, компания nVidia разрабатывает видеокарты для общих вычислений вот уже 5 лет. Не сказать, что до этого нельзя было считать на GPU, но делать это было весьма некомфортно для нормального человека. В 2007 году была предложена универсальная архитектура для вычислительных устройств (CUDA) на базе видеокарт. Это позволило экстенсивно наращивать мощность устройств, сохраняя при этом основные особенности архитектуры. То есть количество процессоров и объём памяти постоянно растут, а вот разделение памяти на shared/global/texture и регистры так и сохраняются ещё с тех давних времён (с СС 2.0 появились также surface и пара кэшей, но это уже другая песня).
Однако ничто не стоит на месте и архитектура и набор команд со временем изменяются – иногда значительно, иногда не очень. Вот для отображения семейств GPU с идентичной архитектурой и были определены версии Compute сapability (СС). Для примера: устройства с CC 1.0 не умели делать атомарных операций вообще, с СС 1.1 – умели в глобальной памяти а с СС 1.2 – и в глобальной и в shared. Полный список возможностей разных СС традиционно приводится в конце CUDA C Programming Guide.
Name already in use
CUDA-Programming / src / 01-introduction / readme.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Chapter 1: Introduction to GPU and CUDA
1.1 Introduction to GPU
GPU means graphics processing unit , which is usually compared to CPU (central processing unit). While a typical CPU has a few relatively fast cores, a typical GPU has hundreds or thousands of relatively slow cores. In a CPU, more transistors are devoted to cache and control; in a GPU, more transistors are devoted to data processing.
GPU computing is heterogeneous computing . It involves both CPU and GPU, which are usually referred to as host and device , respectively. Both CPU and non-embedded GPU have their own DRAM (dynamic random-access memory), and they are usually connected by a PCIe(peripheral component interconnect express)bus.
We only consider GPUs from Nvidia, because CUDA programming only supports these GPUs. There are a few series of Nvidia GPUs:
- Tesla series: good for scientific computing but expensive.
- GeForce series: cheaper but less professional.
- Quadro series: kind of between the above two.
- Jetson series: embedded device (I have never used these).
Every GPU has a version number X.Y to indicate its compute capability. Here, X is a major version number, and Y is a minor version number. A major version number corresponds to a major GPU architecture and is also named after a famous scientist. See the following table.
| Major compute capability | architecture name | release year |
|---|---|---|
| X=1 | Tesla | 2006 |
| X=2 | Fermi | 2010 |
| X=3 | Kepler | 2012 |
| X=5 | Maxwell | 2014 |
| X=6 | Pascal | 2016 |
| X=7 | Volta | 2017 |
| X.Y=7.5 | Turing | 2018 |
| X=8 | Ampere | 2020 |
GPUs older than Pascal will become deprecated soon. We will focus on GPUs no older than Pascal.
The compute capability of a GPU is not directly related to its performance. The following table lists the major metrics regarding performance for a few selected GPUs.
| GPU | compute capability | memory capacity | memory bandwidth | double-precision peak FLOPs | single-precision peak FLOPs |
|---|---|---|---|---|---|
| Tesla P100 | 6.0 | 16 GB | 732 GB/s | 4.7 TFLOPs | 9.3 TFLOPs |
| Tesla V100 | 7.0 | 32 GB | 900 GB/s | 7 TFLOPs | 14 TFLOPs |
| GeForce RTX 2070 | 7.5 | 8 GB | 448 GB/s | 0.2 TFLOPs | 6.5 TFLOPs |
| GeForce RTX 2080ti | 7.5 | 11 GB | 732 GB/s | 0.4 TFLOPs | 13 TFLOPs |
We notice that the double precision performance of a GeForce GPU is only 1/32 of its single-precision performance.
1.2 Introduction to CUDA
There are a few tools for GPU computing, including CUDA, OpenCL, and OpenACC, but we only consider CUDA in this book. We also only consider CUDA based on C++, which is called CUDA C++ for short. We will not consider CUDA FORTRAN.
CUDA provides two APIs (Application Programming Interfaces) for developers: the CUDA driver API and the CUDA runtime API. The CUDA driver API is more fundamental (low-level) and more flexible. The CUDA runtime API is constructed based on the CUDA driver API and is easier to use. We only consider the CUDA runtime API.
There are also many CUDA versions, which can also be represented as X.Y . The following table lists a few recent CUDA versions and the supported compute capabilities.
| CUDA versions | supported GPUs |
|---|---|
| CUDA 11.0 | Compute capability 3.5-8.0 (Kepler to Ampere) |
| CUDA 10.0-10.2 | Compute capability 3.0-7.5 (Kepler to Turing) |
| CUDA 9.0-9.2 | Compute capability 3.0-7.2 (Kepler to Volta) |
| CUDA 8.0 | Compute capability 2.0-6.2 (Fermi to Pascal) |
1.3 Installing CUDA
For Windows, one needs to install both CUDA and Visual Studio:
Installing Visual Studio. Go to https://visualstudio.microsoft.com/free-developer-offers/ and download a free Visual Studio (Community version). For the purpose of this book, we only need to install Desktop development with C++ within the many components of Visual Studio.
Installing CUDA. Go to https://developer.nvidia.com/cuda-downloads and choose a Windows CUDA version and install it. You can choose the highest version that supports your GPU.
After installing both Visual Studio and CUDA (The ProgramData folder might be hiden and you can enable to show it), go to the following folder
and use Visual Studio to open the solution deviceQuery_vs2019.sln . Then build the solution and run the executable. If you see Result = PASS at the end of the output, congratulations! If you encountered problems, you can check the manual carefully: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows.
In this book, we will not use the Visual Studio IDE to develop CUDA programs. Instead, we use the command line (called terminal in Linux and command prompt in Windows) and, if needed, the make program. In Windows, to make the MSVC (Microsoft Visual C++ Compiler) cl.exe available, one can follow the following steps to open a command prompt:
In some cases, we need to have administrator rights, which can be achieved by right clicking x64 Native Tools Command Prompt for VS 2019 and choosing more and then run as administrator .
1.4 Using the nvidia-smi program
After installing CUDA, one should be able to use the program (an executable) nvidia-smi (Nvidia’s system management interface)from the command line. Simply type the name of this program:
it will show the information regarding the GPU(s) in the system. Here is an example from my laptop:
РВС. Контрольные вопросы по всем лабам. 1 лаба вопросы Какая версия compute capability у архитектуры nvidia fermi
Единственный в мире Музей Смайликов
Самая яркая достопримечательность Крыма
Скачать 22.62 Kb.
- Какая версия compute capability у архитектуры NVIDIA Fermi?
- Какая максимальная размерность блока у GPU с compute capability 3.0?
- Предположим, вы используете одномерную сетку и блок. Если максимальная размерность сетки на устройстве 65535, а максимальная размерность блока 512, какое максимальное количество нитей может быть запущено на GPU?
- При каких условиях программист предпочтет не запускать максимальное количество нитей?
- Что может помешать программе запустить максимальное количество нитей?
- Что такое разделяемая память?
- Что такое глобальная память?
- Что такое константная память?
- Что характеризует размер варпа в GPU?
- Поддерживаются ли числа двойной точности в GPU версии 1.3?
Что такое КУДА?
КУДА – это програмно проектная архитектура, она нужна для выполнения видеопроцессов на НВИДИА
Thread – это?
Thread – это нить, а нить — это виртуальный процессор Фоннеймана
С какой версии поддерживаются числа двойной точности?
Какие блоки используются в архитектуре Фоннеймана?
Оперативная память, устройства ввода-вывода, управляющее устройство (устройство управления процессором).
УУ организует пошаговое выполнение программы. Оно последовательно загружает машинный код, распознает его и посылает в АЛУ на выполнение той или иной операции.
АЛУ выполняет Арифметическо-логические опреации над операндами, находящиеся в памяти или в регистрах
Что требуется для разделенной памяти?
Оно требует синхронизации, а то будет все съезжать и поттормаживать
Сколько записей в глобальной памяти
Каждый блок нитей выполнит по одному атомарному сложению в ячейку памяти
1) Версия 2.1 compute capability у архитектуры NVIDIA Fermi
2) Размерность блока 1024х1024х64
У версии 3.0 1024 х 64 х 64
3) Для второй около 4 млн , а для третьего 33 млн с чем-то можно запустить
4) При условии , если задача слишком проста и нет необходимости запускать все нити или же слишком мало информации
6) Разделяемая память (shared memory) относиться к быстрому типу памяти. Разделяемую память рекомендуется использовать для минимизации обращение к глобальной памяти, а так же для хранения локальных переменных функций. Адресация разделяемой памяти между нитями потока одинакова в пределах одного блока, что может быть использовано для обмена данными между потоками в пределах одного блока. Для размещения данных в разделяемой памяти используется спецификатор __shared__.
Скорость, доступность, функционал:
Скорость: быстрая
Доступность: в потоках в пределах одного блока
Функционал: чтение запись
7) Глобальная память (global memory) – самый медленный тип памяти, из доступных GPU. Глобальные переменные можно выделить с помощью спецификатора __global__, а так же динамически, с помощью функций из семейства cudMallocXXX. Глобальная память в основном служит для хранения больших объемов данных, поступивших на device с host’а, данное перемещение осуществляется с использованием функций cudaMemcpyXXX. В алгоритмах, требующих высокой производительности, количество операций с глобальной памятью необходимо свести к минимуму.
Скорость, доступность, функционал:
Скорость: самый медленный
Доступность: Всем потокам
Функционал: Хранит большие обьемы данных , которые поступают с хоста . Чтение , запись
8) Константная память (constant memory) является достаточно быстрой из доступных GPU. Отличительной особенностью константной памяти является возможность записи данных с хоста, но при этом в пределах GPU возможно лишь чтение из этой памяти, что и обуславливает её название. Для размещения данных в константной памяти предусмотрен спецификатор __constant__. Если необходимо использовать массив в константной памяти, то его размер необходимо указать заранее, так как динамическое выделение в отличие от глобальной памяти в константной не поддерживается. Для записи с хоста в константную память используется функция cudaMemcpyToSymbol, и для копирования с device’а на хост cudaMemcpyFromSymbol, как видно этот подход несколько отличается от подхода при работе с глобальной памятью.
Скорость, доступность, функционал:
—скорость: быстрая
—функционал: она доступна только для чтения. Единственная его функция – чтение
Особенность константной памяти является возможность записи данных с хоста
9) Варп (Warp) — 32 последовательно идущих треда, выполняется физически одновременно.
10) Да она поддерживается…
с версии 1.3 – операции над числами с плавающей точкой двойной точности;
2 лаба
(1) Сколько операций с плавающей точкой выполняется в вашем ядре сложения векторов? ОБЪЯСНИТЬ.
(2) Сколько чтений из глобальной памяти производится вашим ядром? ОБЪЯСНИТЬ.
(3) Сколько записей в глобальную память производится вашим ядром? ОБЪЯСНИТЬ.
(4) Опишите возможный вариант оптимизации ядра для увеличения производительности.
(5) Назовите три приложения сложения векторов.
Вектора:
Действия с плавающей точкой — сколько арифм действий выполняется. n действий. По одному на каждую пару элементов векторов. Чтений — 2n. Записей n.
является библиотекой от расширения CUDA C. Она нужна для того, чтобы можно было получать встроенные модули (например, типы данных) и была возможность использования API CUDA во время выполнения компиляции с хоста.
3 лаба
(1) Сколько операций с плавающей точкой выполняется в вашем ядре сложения векторов? ОБЪЯСНИТЬ.
(2) Сколько чтений из глобальной памяти производится вашим ядром? ОБЪЯСНИТЬ.
(3) Сколько записей в глобальную память производится вашим ядром? ОБЪЯСНИТЬ.
(4) Каким образом функциональный стиль кода сложения векторов в Thrust делает разработку проще или сложнее?
Ответы:
Операций и записей сколько?
Опреаций 3 с плающей точкой , на каждый пиксель по 3
На сколько ты умножаешь?
Ф-это слово фреквенси (интенсивность)
Thrust удобен возможностью быстро реализовывать необходимые вычислительные алгоритмы в более простой и читаемой форме, чем явное программирование на CUDA.
4 лаба
(1) Сколько операций с плавающей точкой выполняется в вашем ядре? ОБЪЯСНИТЬ.
(2) Какой формат будет более эффективным для преобразования цвета: 2D матрица, где каждый элемент представляет собой значение RGB, или 3D матрица, где каждый срез по оси Z обозначает цвет? То есть будет ли лучше чередование цветов? Вы можете назвать приложение, где противоположный вариант будет лучшим?
(3) Сколько чтений из глобальной памяти производится вашим ядром? ОБЪЯСНИТЬ.
(4) Сколько записей в глобальную память производится вашим ядром? ОБЪЯСНИТЬ.
(5) Опишите, какие оптимизации можно сделать в вашем ядре, чтобы достичь увеличения производительности.
(6) Назовите три применения преобразования цветов.
Я перевозу сначала , получаю фото и каждый пиксель перевожу в определенный оттенок серого
1 запись, т.к я записываю на пиксель
5 лаба
(1) Сколько операций с плавающей точкой выполняется в вашем ядре? ОБЪЯСНИТЬ.
(2) Сколько чтений из глобальной памяти производится вашим ядром? ОБЪЯСНИТЬ.
(3) Сколько записей в глобальную память производится вашим ядром? ОБЪЯСНИТЬ.