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

Произведение двух квадратных матриц 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  CUDA Toolkit 4.2

Программа должна быть скомпилирована CUDA 3.2, 4.2, 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. Вейвлет преобразование Haar’a

  16. *Метод конечных элементов для уравнения Гельмгольца в заданной области.

  17. Свертка с использованием FFT

  18. FFT 3D

  19. Решение краевых задач, системы линейных алгебраических уравнений

  20. Решение 1D/2D задачи диффузии

  21. Решение СЛАУ с треугольной разряженной матрицей

  22. Решение уравнения Пуассона

  23. Оптимизация алгоритма reduce

  24. Оптимизация алгоритма scan

  25. Найти сумму квадратов методом scan

  26. Оптимизация алгоритма histogram

  27. Аппроксимировать sin(x) кубическим сплайном

  28. Генерация случайных чисел

  29. Вывести на экран 10^8 чисел менее чем за 2 секунды.

  • Нет меток