CUDA: суперкомпьютерные вычисления понятным языком. Часть 2. | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- 99% translated in draft. Almost done, let's finish it!
If you do not want to register an account, you can sign in with OpenID.
CUDA, Supercomputing for the Masses: Part 2 | CUDA: суперкомпьютерные вычисления понятным языком. Часть 2. | |
In Part 1 of this article series, I presented a simple first CUDA (short for "Compute Unified Device Architecture") program -- moveArrays.cu -- to familiarize you with the CUDA tools for building and executing programs. For C programmers, this program did nothing more than call the CUDA API to allocate memory and move data to and from the CUDA device. Nothing new was added that might cause confusion in learning how to use the tools to build and run a CUDA program. | В первой части серии я показал первую программу на CUDA ("Compute Unified Device Architecture") - moveArrays.cu - чтоб познакомить вас с инструментарием разработки на CUDA. Для Си-программистов, эта программа не более чем обращение к CUDA API для выделения памяти и перемещения данных в устройство CUDA и обратно. Не было показано ничего нового, того, что могло бы вызвать затруднения в понимании CUDA инструментария. | |
This article builds on that first example by adding a few additional lines of code to perform a simple calculation on the CUDA device -- specifically incrementing each element in a floating-point array by 1. Amazingly, this example already provides the basic framework ("move data to CUDA-enabled device(s), perform a calculation and retrieve result") for solving many problems with CUDA! | В этой статье мы продолжим работу над первым примером и добавим всего несколько строк кода выполняющих простое вычисление на CUDA устройстве, а именно увеличение каждого элемента массива чисел с плавающей точкой на единицу. Удивительно, но эта демонстрационная программка - отправляющая данные в устройство, выполнающая вычисления и извлекающая результат дает нам вполне работоспособный фреймворк для решения многих реальных задач с CUDA! | |
Before tackling more advanced topics, you first need to understand: | ||
What is a kernel? A kernel is a function callable from the host and executed on the CUDA device -- simultaneously by many threads in parallel. | Что такое зерно (kernel)? Это функция вызываемая главным приложением (хостом),, но выполняемая на CUDA устройстве параллельно, множеством потоков. | |
How does the host call a kernel? This involves specifying the name of the kernel plus an execution configuration. For the purposes of this column, an execution configuration just means defining the number of parallel threads in a group and the number of groups to use when running the kernel for the CUDA device. This is actually an important topic that will be discussed in greater depth in future columns. | Как хост вызывает ядро? Для вызова нужно сообщить имя ядра и параметры исполнения (execution configuration). В этой статье можно упрощенно описать параметры исполнения двумя числами: числом потоков в одном блоке и числом блоков используемых для исполнения ядра на CUDA устройстве. На самом же деле параметры исполнения это довольно важная штука, которая позже будет описана подробнее. | Comment was deleted — > parallel threads in a group Здесь речь идет не просто о группе, а о блоках потоках. Именно блоках, если придерживаться терминологии от NVidia. — itcrowd — configuration = конфигурация, топология, компоновка или профиль. Но в каком мире configuration = параметры? — zanuda — Это близкое по смыслу слово и оно подходит, потому что вызов ядра происходит именно через задание параметров. Примерно так: gpu_kernel<<<16, 32>>>(data); где в <<< ... >>> и находятся те самые параметры(ну или конфигурация) о которых мы говорим. То есть происходит вызов ядра с заданными параметрами исполнения. Конфигурация тоже пойдет, но не совсем то. — itcrowd |
How to synchronize kernels and host code. | ||
At the top of the Listing One (incrementArrays.cu), we see an example host routine, incrementArrayOnHost and our first kernel, incrementArraysOnDevice. | В начале Листинга 1 (incrementArrays.cu) приведены примеры процедуры выполняемая на хосте, incrementArrayOnHost и первое ядро, incrementArraysOnDevice. | |
The host function incrementArrayOnHost is just a simple loop over the number of elements in an array to increment each array element by one. This function is used for comparison purposes at the end of this code to verify the kernel performed the correct calculation on the CUDA device. | Функция выполняемая на хосте incrementArrayOnHost это обычный цикл перебора элементов в массиве, где каждый элемент массив будет увеличен на единицу. Она приведена здесь лишь для сравнения и подтверждения того, что CUDA устройство выполнило вычисления верно. | — to increment each array element by one - это слова автора. Мне кажется, при переводе не надо состязаться с автором и выбрасывать то, что он это хотел сказать и сказал. — zanuda Comment was deleted |
Next in the Listing One is our first CUDA kernel, incrementArrayOnDevice. CUDA provides several extensions to the C-language. The function type qualifier __global__ declares a function as being an executable kernel on the CUDA device, which can only be called from the host. All kernels must be declared with a return type of void. | Далее в нашем Листинге 1 идет наше первое CUDA ядро, incrementArrayOnDevice. CUDA привносит в Си несколько расширений. Спецификатор типа функции __global__ описывает функцию как исполняемое ядро для CUDA устройства, которое может быть вызвано только хостом. Все ядра должны возвращать void. | Comment was deleted — Не совсем понял - что не так с переводом? — itcrowd — А точно все ядра должны возвращать void или только global? — zanuda — __global__ это не возвращаемое значение, это дополнение языка C означающие,что эта функция будет исполняться на GPU. К функции предъявляется условие возвращать она ничего не должна - т.е. void — itcrowd Comment was deleted |

Comment was deleted
— Я тоже не в восторге от зерна. Однако "ядро" воспринимается как нечто весьма заумное и тяжелое. По аналогии с ядром линукса. Здесь "кёнл" - атомарная вычисляющая функция, легковесная и дешевая. — zanuda
— Все такие надо оставить ядро и ничего тяжеловесного нет - подразумевается функция исполняемая на видеокарте. Если кто захочет почитать материалы на английском, то и искать надо будет kernel. — itcrowd