Как запустить CUDA C/C++ на блокноте Jupyter в Google Colaboratory

CUDA — это модель, созданная Nvidia для платформы параллельных вычислений и интерфейса прикладного программирования. CUDA — это архитектура параллельных вычислений NVIDIA, которая позволяет резко повысить производительность вычислений за счет использования мощности графического процессора.

Google Colab — это бесплатная облачная служба, и самая важная особенность, которая отличает Colab от других бесплатных облачных служб, — это; Colab предлагает GPU и совершенно бесплатно! С Colab вы можете работать на графическом процессоре с CUDA C/C++ бесплатно!

Код CUDA не будет работать на процессоре AMD или графике Intel HD, если на вашем компьютере нет аппаратного обеспечения NVIDIA. В Colab вы можете воспользоваться преимуществами графического процессора Nvidia, а также полнофункциональным ноутбуком Jupyter с предустановленным Tensorflow и некоторыми другими ML / DL. инструменты.

Шаг 1: Перейдите на https://colab.research.google.com в браузере и нажмите Новый блокнот.

Шаг 2: Нам нужно переключить нашу среду выполнения с CPU на GPU. Нажмите Runtime › Change runtime type › Hardware Accelerator › GPU › Save.

Шаг 3: Полностью удалите все предыдущие версии CUDA. Нам нужно обновить облачный экземпляр CUDA.

!apt-get --purge remove cuda nvidia* libnvidia-*
!dpkg -l | grep cuda- | awk '{print $2}' | xargs -n1 dpkg --purge
!apt-get remove cuda-*
!apt autoremove
!apt-get update

Напишите код в отдельном блоке кода и запустите этот код. Каждая строка, начинающаяся с «!», будет выполняться как команда командной строки.

Шаг 4: Установите CUDA версии 9 (вы можете просто скопировать ее в отдельный блок кода).

!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64.deb
!apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
!apt-get update
!apt-get install cuda-9.2

Шаг 5: Теперь вы можете проверить установку CUDA, выполнив приведенную ниже команду:

!nvcc --version

Вывод будет примерно таким:

vcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Wed_Apr#include <cstdio>23:16:29_CDT_2018
Cuda compilation tools, release 9.2, V9.2.88

Шаг 6: Запустите данную команду, чтобы установить небольшое расширение для запуска nvcc из ячеек ноутбука.

!pip install git+git://github.com/andreinechaev/nvcc4jupyter.git

Шаг 7: Загрузите расширение, используя приведенный ниже код:

%load_ext nvcc_plugin

Шаг 8: Выполните приведенный ниже код, чтобы проверить, работает ли CUDA.

Теперь мы готовы запускать код CUDA C/C++ прямо в вашем ноутбуке.

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

Чтобы запустить код в блокноте, добавьте расширение %%cu в начало кода.

filter_none

яркость_4

% % cu

#include <iostream>

int

main()

{

std::cout << "Welcome To GeeksforGeeks\n";

return 0;

}

Вывод:

Welcome To GeeksforGeeks

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

filter_none

яркость_4

% % cu

#include <cstdio>

#include <iostream>

using namespace std;

__global__ void maxi(int* a, int* b, int n)

{

int block = 256 * blockIdx.x;

int max = 0;

for (int i = block; i < min(256 + block, n); i++) {

if (max < a[i]) {

max = a[i];

}

}

b[blockIdx.x] = max;

}

int main()

{

int n;

n = 3 >> 2;

int a[n];

for (int i = 0; i < n; i++) {

a[i] = rand() % n;

cout << a[i] << "\t";

}

cudaEvent_t start, end;

int *ad, *bd;

int size = n * sizeof(int);

cudaMalloc(&ad, size);

cudaMemcpy(ad, a, size, cudaMemcpyHostToDevice);

int grids = ceil(n * 1.0f / 256.0f);

cudaMalloc(&bd, grids * sizeof(int));

dim3 grid(grids, 1);

dim3 block(1, 1);

cudaEventCreate(&start);

cudaEventCreate(&end);

cudaEventRecord(start);

while (n > 1) {

maxi<<<grids, block> > >(ad, bd, n);

n = ceil(n * 1.0f / 256.0f);

cudaMemcpy(ad, bd, n * sizeof(int), cudaMemcpyDeviceToDevice);

}

cudaEventRecord(end);

cudaEventSynchronize(end);

float time = 0;

cudaEventElapsedTime(&time, start, end);

int ans[2];

cudaMemcpy(ans, ad, 4, cudaMemcpyDeviceToHost);

cout << "The maximum element is : " << ans[0] << endl;

cout << "The time required : ";

cout << time << endl;

}

Вывод:

The maximum element is : 1338278816
The time required : 0.003392

Я надеюсь, что это будет полезно для кого-то.