Zaujímavosti

ťahák


videní: 202

#include “cuda_runtime.h”
#include “cuda.h”
#include “device_launch_parameters.h”
#include “device_functions.h”
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <chrono>
#include <iostream>

#define THREADS_PER_BLOCK 256
#define BLOCKS_COUNT 2

#define ARRAY_SIZE 2000

void generateRandomValues(int* values) {
srand((unsigned)time(NULL));
for (int i = 0; i < ARRAY_SIZE; i++) {
values[i] = rand() % (ARRAY_SIZE * 10);
}
}
//TODO: deklaruj funkciu is_prime s navratovym typom int tak, aby bola spustitelna z kernelu
__device__ int is_prime(int num) {
if (num <= 1) return 0;
if (num % 2 == 0 && num > 2) return 0;
for (int i = 3; i < num / 2; i += 2) {
if (num % i == 0) {
return 0;
}
}
return 1;
}

// kernel – hladanie prvocisel pomocou GPU paralelne
//TODO: deklaruj funkciu gpu_parallel_prime_numbers ako kernel, nezabudni na navratovy typ
__global__ void gpu_parallel_prime_numbers(int *values, int *result) {
int index = blockDim.x * blockIdx.x + threadIdx.x;

int numbers_per_thread = ARRAY_SIZE / (BLOCKS_COUNT * THREADS_PER_BLOCK) + 1;

int start = index * numbers_per_thread;

for (int i = start; i < start + numbers_per_thread; i++) {
if (i < ARRAY_SIZE) {
result[i] = 0;
if (is_prime(values[i]) == 1) {
result[i] = values[i];
}
}
}
}

int get_count(int *result) {
int count = 0;
for (int i = 0; i < ARRAY_SIZE; i++) {
if (result[i] != 0) {
count++;
}
}
return count;
}

int main() {
using namespace std::chrono;

//generovanie nahodnych hodnot
int h_values[ARRAY_SIZE];
generateRandomValues(h_values);

//alokacia pamate na hoste
int *h_result = (int*)malloc(sizeof(int) * ARRAY_SIZE);
int *h_count = (int*)malloc(sizeof(int));

//alokacia pamate na device
int *d_values;
int *d_result;

//TODO: alokuj pamat na GPU (device) pre polia integerov d_values a d_result o dlzke pola ARRAY_SIZE
cudaMalloc((void **)&d_values, sizeof(int) * ARRAY_SIZE);
cudaMalloc((void **)&d_result, sizeof(int) * ARRAY_SIZE);

//kopirovanie hodnot z hosta na device
cudaMemcpy(d_values, h_values, sizeof(int) * ARRAY_SIZE, cudaMemcpyHostToDevice);

//GPU parallel
cudaEvent_t gpu_start, gpu_end;
float gpu_elapsed;

//eventy na meranie casu
cudaEventCreate(&gpu_start);
cudaEventCreate(&gpu_end);
cudaEventRecord(gpu_start, 0);

//paralelne spracovanie s BLOCKS_COUNT blokmi a THREADS_PER_BLOCK vlaknami
//TODO: spusti kernel pre pocet blokov = BLOCKS_COUNT, vlakien = THREADS_PER_BLOCK, nezabudni na parametre funkcie
gpu_parallel_prime_numbers << <BLOCKS_COUNT, THREADS_PER_BLOCK >> > (d_values, d_result);

cudaEventRecord(gpu_end, 0);
cudaEventSynchronize(gpu_end);
cudaEventElapsedTime(&gpu_elapsed, gpu_start, gpu_end);
cudaEventDestroy(gpu_start);
cudaEventDestroy(gpu_end);

//kopirovanie vysledkov z device na hosta
//TODO: skopiruj obsah pola d_values (host) do pola h_values (device)
cudaMemcpy(h_values, d_values, sizeof(int) * ARRAY_SIZE, cudaMemcpyDeviceToHost);

printf(“Parralel GPU took: %f sec\n”, gpu_elapsed / 1000);
printf(“Number of prime numbers: %d\n”, get_count(h_result));

//uvolnenie pamate
free(h_result);
free(h_count);
//TODO: uvolni pamat pre premenne GPUcka (device) – d_values, d_result
cudaFree(d_values);
cudaFree(d_result);

return 0;
}

b
Komentáre
Hore

Súbory cookie pomáhajú zlepšovať služby. Používaním našich služieb vyjadrujete súhlas s tým, že používame súbory cookie. viac info...

Súbory cookies sú malé textové súbory, ktoré sa umiestnia vo vašom počítači alebo zariadení pri návšteve našej webovej stránky. Tým, že používame súbory cookies nedochádza k porušovaniu zákona č. 122/2013 Z.z. o ochrane osobných údajov, nakoľko ich používaním nezhromažďujeme osobné údaje a ani ich neposkytujeme sprostredkovateľom resp. tretím stranám. Každý užívateľ prezeraním tejto našej webovej stránky súhlasí s ich používaním a ukladaním do svojho prehliadača. O tejto skutočnosti ste upozornený pri návšteve našej webovej stránky a svoj súhlas prejavujete ďalším prezeraním našej webovej stránky. Ak užívateľ nesúhlasí s používaním súborov cookies, našu webovú stránku nenavštevuje alebo súbory cookies aktívne vymažte alebo zablokujte. Ak dôjde k odmietnutiu používania cookies, našu stránku budete môcť naďalej navštíviť, avšak niektoré funkcie nemusia fungovať správne.

Súbory cookies sa ukladajú do počítača užívateľa, aby mu umožnili prístup k rôznym funkciám. Súbory cookies používame na zvýšenie efektivity Vašich návštev na našej webovej stránke. Súbory cookies používame na účely zapamätania predvolieb prehľadávania a to napríklad veľkosti textu, uprednostňovaného jazyka, predvolieb farieb atď. čo nám umožňuje jednoduchšie prechádzanie našou stránkou, a zhromažďovanie analytických informácií a to napríklad počtu návštevníkov na našej webovej stránke. Cookies nám umožňujú lepšie zhromažďovať informácie o používaní našej webovej stránky. V ich údajoch však v žiadnom prípade nezhromažďujeme vaše osobné údaje a informácie. Ukladá sa len jedinečný identifikátor relácie, ktorý nám umožňuje opätovne načítať profil a predvoľby užívateľa pri vašej ďalšej návšteve webovej stránky.

Na prevádzku našich webových stránok používame rôzne typy súborov cookie:
(a) súbory cookie relácie, ktoré sú dočasne uložené v počítači alebo zariadení počas relácie prehľadávania a po jej ukončení sa odstráni a
(b) trvalé súbory cookie, ktoré sa uchovávajú v počítači dlhší čas. Tieto trvalé súbory cookie môže užívateľ vymazať.

Reklama – Pomocou týchto súborov cookie môžeme dynamicky zobrazovať reklamy tretích strán na našich webových stránkach. Naše webové stránky tiež môžu obsahovať prvky, ktoré nastavujú súbory cookie za subjekty tretej strany, napr. tlačidlo „Like“ služby Facebook alebo tlačidlo „Tweet“ služby Twitter, či Google Plus a pod.

Ponuka prevažnej časti prehľadávačov obsahuje možnosti konfigurácie nastavení t.j. prehľadávač zvyčajne obsahuje možnosti ako napr. povolenie súborov cookie, prezeranie súborov cookie, zakázanie všetkých alebo vybratých súborov cookie atď. Ďalšie informácie o správe súborov cookies môžete nájsť na týchto adresách…

Zatvoriť