Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałJowita Bluszcz Został zmieniony 10 lat temu
2
TROCHĘ HISTORII Marek Zając
5
PO CO UŻYWAĆ OPENCL? Marek Zając
6
Intel Core i5 2550k OC 4,2 GHz AMD Radeon HD7870 OC 1,1 GHz
7
Marek Zając Intel Core i5 2550k 4 rdzenie AMD Radeon HD7870 1280 rdzeni
8
Marek Zając
10
DLACZEGO NIE UŻYWAĆ OPENCL? Marek Zając
12
CZEGO NAM TRZEBA? Marek Zając
15
CZAS NA NAJLEPSZE! Marek Zając
16
KOD!
17
TRADYCYJNE PODEJŚCIE Marek Zając
18
double* tab = new double[100000000]; //prepare array... //... for(int i = 0; i < 100000000; i++) { tab[i] *= 2.5; }
19
OPENCL Marek Zając
20
double* tab = new double[100000000]; //prepare array... //... …
21
Marek Zając cl_int err; cl::vector platformList; cl::Platform::get(&platformList); … …
22
Marek Zając cl_context_properties cprops[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties) (platformList[0])(), 0 }; cl::Context context(CL_DEVICE_TYPE_ALL, cprops, NULL, NULL, &err); cl::vector devices; devices = context.getInfo (); … …
23
Marek Zając std::ifstream file("func.cl"); std::string prog(std::istreambuf_iterator (file), (std::istreambuf_iterator ())); cl::Program::Sources source(1, std::make_pair(prog.c_str(), prog.length() + 1)); cl::Program program(context, source); err = program.build(devices, ""); cl::Kernel kernel(program, "func", &err); … …
24
… JUŻ PRAWIE, JESZCZE TYLKO … Marek Zając
25
cl::Buffer in(context, CL_MEM_READ_WRITE, sizeof(double) * 100000000); cl::CommandQueue queue(context, devices[0], 0, NULL); const size_t local_ws = 256; const size_t global_ws = ceil((double)local_ws / 100000000); cl::Event event; … …
26
Marek Zając
27
queue.enqueueWriteBuffer(in, CL_TRUE, 0, sizeof(double) * 100000000, tab); kernel.setArg(0, in); kernel.setArg(1, 100000000); queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(global_ws), cl::NDRange(local_ws), NULL, &event); event.wait(); queue.enqueueReadBuffer(in, CL_TRUE, 0, sizeof(double) * 100000000, tab); …
28
CZYŻBY KONIEC? Marek Zając
30
__kernel void func(__global double* in, int n) { size_t id = get_global_id(0); in[id] *= 2.5; }
31
TO MOŻE JAKIŚ TEST? ŻĄDAMY DOWODÓW! Marek Zając
32
__kernel void func(__global double* in, double x, int n) { size_t id = get_global_id(0); if(id < n) { in[id] *= x; in[id] += 10.0 * x; in[id] = sqrt(in[i]); }
33
Marek Zając K = 10000000 K * 200
34
WYNIK TO… Marek Zając
35
CPU GPU 11,731 sek. 6,068 sek.
36
Marek Zając
38
double => float Marek Zając CPU GPU 12,963 sek. 2,979 sek.
39
Marek Zając DZIĘKUJĘ ZA UWAGĘ ŹRÓDŁA OBRAZKÓW: 99% KRADZIONE Z INTERNETU, 1% WŁAŚNE
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.