версію Compute Capability в залежності від типу GPU і т.д.
Зазвичай я створюю чистий проект (Empty Project), так як Precompiled Headers навряд чи нагоді для CUDA. p align="justify"> Важливо відзначити, як збирається CUDA додаток. Файли з розширенням *. Cpp обробляються компілятором MS C + + (cl.exe), а файли c розширенням *. Cu компілятором CUDA (nvcc.exe), який у свою чергу визначає, який код буде працювати на GPU, а який на CPU. Код з *. Cu, що працює на CPU, передається на компіляцію MS C + +, цю особливість зручно використовувати для написання динамічних бібліотек, які експортуватимуть функції, які використовують для розрахунків GPU. p align="justify"> Далі наводжу лістинг простої програми на CUDA, який виводить на екран інформацію про апаратні можливості GPU.
Експериментальна машина
Мірою продуктивності обчислювальних систем, яка показує кількість операцій з плаваючою точкою виконуваних за секунду є одиниця, звана FLOPS. Нижче в таблицях можна побачити на скільки відрізняється теоретична продуктивність сучасних відеокарт і сучасних процесорів при виконанні операцій з плаваючою крапкою. p align="justify"> Машина, на якій я буду робити дослідження має наступну конфігурацію
Intel Core i7-950 3.03 ГГц
Gb DDR-3
GeForce GTX 280
ВидеокартыМодельГигафлопсGeForce GTX 690 5622GeForce GTX 5801581.056GeForce GTX 4801344.96GeForce GTX 280933.120GeForce 9800 GTX648GeForce 8800 GTS 640mb346 Таблиця 1. Порівняння продуктивності відеокарт
ПроцессорыМодельГигафлопсAMD Phenom II X6 1100T Black Edition 3.3 ГГц60.1Intel Core i7-950 3.03 ГГц53.28Intel Core 2 Quad Q8300 2.5 ГГц40AMD AMD ATHLON II X4 645 3.1 ГГц38.44Intel Core 2 Duo 2.4 ГГц19.02AMD Athlon 64 X2 4200 + 2.2 ГГц13.02
Таблиця 2. Порівняння продуктивності процесорів p align="justify"> Як видно з таблиць, теоретична продуктивність моєї відеокарти в 17 разів перевершує продуктивність мого процесора.
Для реалізації своєї програми я використовував Visual Studio 2010, і написав консольний додаток.
Код програми підсумовування вектора GPU
# ifndef _COMMON_H
# define _COMMON_H
# define VECTOR_SIZE 8192
# define BLOCK_SIZE 512
# define BLOCKS (VECTOR_SIZE/BLOCK_SIZE) "C" void reductionGPU (int * d_Dst, int * d_Src);
# endif
# include
# include "common.h"
__global__ void reductionKernel (int * d_Dst, int * d_Src)
{
__shared__ int data [BLOCK_SIZE]; tid = threadIdx.x; i...