Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając.

Podobne prezentacje


Prezentacja na temat: "TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając."— Zapis prezentacji:

1

2 TROCHĘ HISTORII Marek Zając

3

4

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

9

10 DLACZEGO NIE UŻYWAĆ OPENCL? Marek Zając

11

12 CZEGO NAM TRZEBA? Marek Zając

13

14

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

29

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

37

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


Pobierz ppt "TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając."

Podobne prezentacje


Reklamy Google