Лабораторная 2

Лабораторная работа №2 по курсу Параллельная обработка данных: 8 факультет

Работа с матрицами

Умножение матриц. Простейшая реализация (пример)

Произведение двух квадратных матриц A и B размера N*N, N кратно 16

Матрицы расположены в глобальной памяти

По одной нити на каждый элемент произведения

2D блок - 16*16

2D грид

На каждый элемент

 2*N арифметических операций

 2*N обращений к глобальной памяти

Memory bound (медленный доступ к памяти)

 

#define BLOCK_SIZE 16

__global__ void matMult ( float * a, float * b, int n, float * c )

{

int bx = blockIdx.x;

int by = blockIdx.y;

int tx = threadIdx.x;

int ty = threadIdx.y;

float sum = 0.0f;

int ia = n * BLOCK_SIZE * by + n * ty;

int ib = BLOCK_SIZE * bx + tx;

int ic = n * BLOCK_SIZE * by + BLOCK_SIZE * bx;

for ( int k = 0; k < n; k++ )

sum += a [ia + k] * b [ib + k*n];

c [ic + n * ty + tx] = sum;

}

int numBytes = N * N * sizeof ( float );

float * adev, * bdev, * cdev ;

dim3 threads ( BLOCK_SIZE, BLOCK_SIZE );

dim3 blocks ( N / threads.x, N / threads.y);

cudaMalloc ( (void**)&adev, numBytes ); // allocate DRAM

cudaMalloc ( (void**)&bdev, numBytes ); // allocate DRAM

cudaMalloc ( (void**)&cdev, numBytes ); // allocate DRAM

// copy from CPU to DRAM

cudaMemcpy ( adev, a, numBytes, cudaMemcpyHostToDevice );

cudaMemcpy ( bdev, b, numBytes, cudaMemcpyHostToDevice );

matMult<<<blocks, threads>>> ( adev, bdev, N, cdev );

cudaThreadSynchronize();

cudaMemcpy ( c, cdev, numBytes, cudaMemcpyDeviceToHost );

// free GPU memory

cudaFree ( adev );

cudaFree ( bdev );

cudaFree ( cdev );

 

Общие правила по оформлению программ

Программа

- должна выполняться параллельно

- должна распределять память

- должна использовать векторные операции

Программа должна делать проверки на ошибки:

 - Наличие аппаратной поддержки CUDA

 - Открылся ли файл исходных данных

 - Правилен ли формат данных?

 

Программа должна быть скомпилирована с опцией Release и запускаться на Windows 7 или Ubutu 13.04, CentOs 6

Программа должна быть скомпилирована CUDA, OpenCl, OpenACC

Программа должна компилироваться. Для этого должен быть приложен vcproj для VS2008, VS2010  либо makefile + .bat

 

Варианты заданий (* отмечены задачи повышенной сложности)

  1. Сложение 1000000 матриц (сравнение производительности с CPU)
  2. Перемножение матриц
  3. Поиск А-1 для заданной матрицы
  4. Обращение матрицы методом Монте-карло
  5. Поиск решений F(x) = 0 на интервале
  6. Метод наименьших квадратов
  7. Гистограмма
  8. Битоническая сортировка
  9. Редукция
  10. Thrust сортировка  1000000 матриц
  11. Поразрядная сортировка
  12. Найти сумму квадратов
  13. Найти среднеквадратичное отклонение
  14. Найти дисперсию
  15. Свертка с использованием FFT
  16. FFT 3D из cuFFT
  17. Решение СЛАУ с треугольной разряженной матрицей
  18. Оптимизация алгоритма reduce
  19. Оптимизация алгоритма scan
  20. Найти сумму квадратов методом scan
  21. Оптимизация алгоритма histogram
  22.  Аппроксимировать sin(x) кубическим сплайном
  23.  Генерация случайных чисел
  24.  Вывести на экран 10^8 чисел менее чем за 2 секунды.

 

Литература

1.Боресков А.В., Харламов А.В. Основы работы с технологией CUDA. – Изд-во: ДМК Пресс, 2010, 232 стр

2. Казённов А.М. Основы технологии CUDA // Компьютерные исследования и моделирование 2010 Т. 2 № 3 С. 295–308

 

 

Варианты заданий составлены проф. Зайцевым В.Е, проф. Ревизниковым Д.Л. и м.н.с. Семеновым С.А.

 

 

 

 

  • Нет меток