__global__ void pi_kern (CUDA_FLOAT * res)
{n = threadIdx.x + blockIdx.x * BLOCK_SIZE; _FLOAT x0 = n * 1.f/(BLOCK_SIZE * GRID_SIZE);// Началоотрезка інтегрірованія_FLOAT y0 = sqrtf (1 - x0 * x0) ; _FLOAT dx = 1.f/(1.f * BLOCK_SIZE * GRID_SIZE);// Шагінтегрірованія
CUDA_FLOAT s = 0;// Значення інтеграла по відрізку, данномутекущему тред
CUDA_FLOAT x1, y1; = x0 + dx; = sqrtf (1 - x1 * x1); = (y0 + y1) * dx/2.f ;//Площа трапеції
res [n] = s ;//Запис результату в глобальну пам'ять
} main (int argc, char ** argv)
{_t time; _FLOAT * res_d ;//Результати на пристрої
CUDA_FLOAT res [GRID_SIZE * BLOCK_SIZE] ;//Результати в хостової пам'яті ((void **) & res_d, sizeof (CUDA_FLOAT) * GRID_SIZE *
BLOCK_SIZE) ;//Виділення пам'яті на CPUл
// Розмір гріду та блоку на GPU
dim3 grid (GRID_SIZE); block (BLOCK_SIZE); = clock (); _kern <<>> (res_d) ;//Запуск ядра () ;/ /Очікуємо завершення роботи ядра (res, res_d, sizeof (CUDA_FLOAT) * GRID_SIZE * BLOCK_SIZE,) ;//Копіюємо результати на хост (res_d) ;//Визволяємо пам'ять на GPU_FLOAT pi = 0; (int i = 0; i < GRID_SIZE * BLOCK_SIZE; i + +)
{+ = res [i];
} * = 4; = clock () - time; ("PI =% .12 f n", pi); ("% .4 f", (double) time/CLOCKS_PER_SEC) ;
getch (); 0;
}
Технічний висновок програми
Розрахунки проводилися 10 разів. 100 000 000 доданок для вирішення числа PI, час роботи програми 35 ~ 37 секунд
Розрахунок на CPU
Потоки, align = "justify"> На CPU 100 000 000 ітерацій займає 598 секунд.
Висновки
При розрахунку числа Пі на CPU за результатами виконаної роботи стало відомо, що чим більше кількість ітерацій, тим ефективніше працює паралельний алгоритм. p align="justify"> Найефективніше - кількість потоків = кількості ядер процесора.
На не великих кількостях ітерацій система hyper-t не дає переваги, за рахунок того, що потоки занадто швидко закінчують свою дію. Але при більш великих обсягах обчислень, hyper-t дозволяє і далі збільшувати продуктивність потокового програмування, за рахунок подвоєння числа реально працюючих в паралельному режимі потоків, приблизно на 20%. p align="justify"> На більш високих значеннях кількості ітерацій максимальне прискорення досягається на 8 потоках, через те, що даний процесор підтримує технологію HyperThreading.
У процесорах з використанням цієї технології кожен фізичний процесор може зберігати стан відразу двох потоків, що для операційної системи виглядає як наявність двох логічних пр...