TROCHĘ HISTORII

39

description

TROCHĘ HISTORII. PO CO UŻYWAĆ OPENCL?. AMD Radeon HD7870 OC 1,1 GHz. Intel Core i5 2550k OC 4,2 GHz. Intel Core i5 2550k 4 rdzenie. AMD Radeon HD7870 1280 rdzeni. DLACZEGO NIE UŻYWAĆ OPENCL?. CZEGO NAM TRZEBA?. CZAS NA NAJLEPSZE!. KOD!. TRADYCYJNE PODEJŚCIE. - PowerPoint PPT Presentation

Transcript of TROCHĘ HISTORII

Page 1: TROCHĘ HISTORII
Page 2: TROCHĘ HISTORII

Marek Zając

TROCHĘ HISTORII

Page 3: TROCHĘ HISTORII

Marek Zając

Page 4: TROCHĘ HISTORII

Marek Zając

Page 5: TROCHĘ HISTORII

Marek Zając

PO CO UŻYWAĆ OPENCL?

Page 6: TROCHĘ HISTORII

Marek Zając

Intel Core i5 2550k OC

4,2 GHz

AMD Radeon HD7870 OC

1,1 GHz

Page 7: TROCHĘ HISTORII

Marek Zając

Intel Core i5 2550k

4 rdzenie

AMD Radeon HD7870

1280 rdzeni

Page 8: TROCHĘ HISTORII

Marek Zając

Page 9: TROCHĘ HISTORII

Marek Zając

Page 10: TROCHĘ HISTORII

Marek Zając

DLACZEGO NIE UŻYWAĆ OPENCL?

Page 11: TROCHĘ HISTORII

Marek Zając

Page 12: TROCHĘ HISTORII

Marek Zając

CZEGO NAM TRZEBA?

Page 13: TROCHĘ HISTORII

Marek Zając

Page 14: TROCHĘ HISTORII

Marek Zając

Page 15: TROCHĘ HISTORII

Marek Zając

CZAS NA NAJLEPSZE!

Page 16: TROCHĘ HISTORII

Marek Zając

KOD!

Page 17: TROCHĘ HISTORII

Marek Zając

TRADYCYJNE PODEJŚCIE

Page 18: TROCHĘ HISTORII

Marek Zając

double* tab = new double[100000000];

//prepare array...//...

for(int i = 0; i < 100000000; i++){

tab[i] *= 2.5;}

Page 19: TROCHĘ HISTORII

Marek Zając

OPENCL

Page 20: TROCHĘ HISTORII

Marek Zając

double* tab = new double[100000000];

//prepare array...//...

Page 21: TROCHĘ HISTORII

Marek Zając

cl_int err;

cl::vector<cl::Platform> platformList;

cl::Platform::get(&platformList);

Page 22: TROCHĘ HISTORII

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<cl::Device> devices;devices = context.getInfo<CL_CONTEXT_DEVICES>();

Page 23: TROCHĘ HISTORII

Marek Zając

std::ifstream file("func.cl"); std::string prog(std::istreambuf_iterator<char>(file), (std::istreambuf_iterator<char>()));

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);

Page 24: TROCHĘ HISTORII

Marek Zając

… JUŻ PRAWIE, JESZCZE TYLKO …

Page 25: TROCHĘ HISTORII

Marek Zając

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;

Page 26: TROCHĘ HISTORII

Marek Zając

Page 27: TROCHĘ HISTORII

Marek Zając

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);

Page 28: TROCHĘ HISTORII

Marek Zając

CZYŻBY KONIEC?

Page 29: TROCHĘ HISTORII

Marek Zając

Page 30: TROCHĘ HISTORII

Marek Zając

__kernel void func(__global double* in, int n){

size_t id = get_global_id(0);in[id] *= 2.5;

}

Page 31: TROCHĘ HISTORII

Marek Zając

TO MOŻE JAKIŚ TEST?„ŻĄDAMY DOWODÓW!”

Page 32: TROCHĘ HISTORII

Marek Zając

__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]);

}}

Page 33: TROCHĘ HISTORII

Marek Zając

K = 10000000

K * 200

Page 34: TROCHĘ HISTORII

Marek Zając

WYNIK TO…

Page 35: TROCHĘ HISTORII

Marek Zając

CPU

GPU

11,731 sek.

6,068 sek.

Page 36: TROCHĘ HISTORII

Marek Zając

Page 37: TROCHĘ HISTORII

Marek Zając

Page 38: TROCHĘ HISTORII

Marek Zając

double => float

CPU

GPU

12,963 sek.

2,979 sek.

Page 39: TROCHĘ HISTORII

Marek Zając

DZIĘKUJĘ ZA UWAGĘ

ŹRÓDŁA OBRAZKÓW: 99% KRADZIONE Z INTERNETU, 1% WŁAŚNE