OpenCL рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╛ GPU рдФрд░ CPU рдкрд░ рд╕рдорд╛рди рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХрд╣рд╛рдиреА

рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдФрд░ рдбрд░рд╛рд╡рдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИред рдЕрдм рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕ рдЕрдЬреАрдм рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдУрдкрдирд╕реАрдПрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреН, рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕рдорд╛рди рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдФрд░ рдореИрдВ рдпрд╣ рднреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдСрд░реНрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдЪрдп


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмреЗрдЪрдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдУрдкрдирд╕реАрдПрд▓ рдПрдХ рднрд╛рд╖рд╛ (рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо) рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╕рдорд╛рди рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред , рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдФрд░ рдЖрдзреБрдирд┐рдХ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рддрд░рд╣ред рдорд╛рдирдХ C99 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдж рдХреНрд░реЛрдиреЛрд╕ рдЧреНрд░реБрдк рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЗрд╕ рдкрд░ рд╣рдо рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХреЛрдб рджрд┐рдЦрд╛ рдХрд░ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ OpenCL рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдмрд▓реНрдХрд┐ рддреБрдЪреНрдЫ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЬреЛ рд▓реЛрдЧ OpenCL рдХреЗ рдЬрд╛рджреВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╕ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдкрдврд╝реЗрдВ рдЬрд╣рд╛рдВ рдореИрдВ MathCalculations рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк OpenCL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реАрдзреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рдЦрдВрдб рдкрд░ рдЬрд╛рдПрдВ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА MathCalculations рдХреЛ рджреЗрдЦреЗрдВ)ред
int main (int argc, char * argv [])
int main(int argc, char* argv[]) { GenerateTestData(); PerformCalculationsOnHost(); //Get all available platforms vector<cl::Platform> platforms; cl::Platform::get(&platforms); for (int iPlatform=0; iPlatform<platforms.size(); iPlatform++) { //Get all available devices on selected platform std::vector<cl::Device> devices; platforms[iPlatform].getDevices(CL_DEVICE_TYPE_ALL, &devices); //Perform test on each device for (int iDevice=0; iDevice<devices.size(); iDevice++) { try { PerformTestOnDevice(devices[iDevice]); } catch(cl::Error error) { std::cout << error.what() << "(" << error.err() << ")" << std::endl; } CheckResults(); } } //Clean buffers delete[](pInputVector1); delete[](pInputVector2); delete[](pOutputVector); delete[](pOutputVectorHost); return 0; } 


рдпрд╣ рд╣реИ рдХрд┐ OpenCL рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рд░реВрдк, рдпрд╛ рдмрд▓реНрдХрд┐, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдореВрд░реНрдд рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛, рдЬреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЖрдПрдВрдЧреЗред рддреЛ, рдЪрд▓реЛ рд▓рд╛рдЗрди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рднрд╛рдЧ рдПрдХ - рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдФрд░ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд


GenerateTestData (); рдпрд╣ рдЕрд╕рд╛рдзрд╛рд░рдг рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рднреА рднрд░рддрд╛ рд╣реИред
рд╢реВрдиреНрдп GenerateTestData ()
 void GenerateTestData() { pInputVector1 = new float[DATA_SIZE]; pInputVector2 = new float[DATA_SIZE]; pOutputVector = new float[DATA_SIZE]; pOutputVectorHost = new float[DATA_SIZE]; srand (time(NULL)); for (int i=0; i<DATA_SIZE; i++) { pInputVector1[i] = rand() * 1000.0 / RAND_MAX; pInputVector2[i] = rand() * 1000.0 / RAND_MAX; } } 


рдЕрдЧрд▓рд╛ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рд░реЛрд╣ рдЖрддрд╛ рд╣реИ:
рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рди
 void PerformCalculationsOnHost() { cout << "Device: Host" << endl << endl; //Some performance measurement timeValues.clear(); __int64 start_count; __int64 end_count; __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); for(int iTest=0; iTest<(TESTS_NUMBER/10); iTest++) { QueryPerformanceCounter((LARGE_INTEGER*)&start_count); for(int iJob=0; iJob<DATA_SIZE; iJob++) { //Check boundary conditions if (iJob >= DATA_SIZE) break; //Perform calculations pOutputVectorHost[iJob] = MathCalculations(pInputVector1[iJob], pInputVector2[iJob]); } QueryPerformanceCounter((LARGE_INTEGER*)&end_count); double time = 1000 * (double)(end_count - start_count) / (double)freq; timeValues.push_back(time); } hostPerformanceTimeMS = std::accumulate(timeValues.begin(), timeValues.end(), 0)/timeValues.size(); PrintTimeStatistic(); } 


рдЗрд╕рдореЗрдВ рдкрд╣рд▓рд╛ рдЪрдХреНрд░
 for(int iTest=0; iTest<(TESTS_NUMBER/10); iTest++) 

рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдЧрдгрдирд╛ рдХрд╛ рд╕рдордп рдЯрд╛рдЗрдорд╡реИрд▓реНрдпреВрдЬрд╝ рдПрд░реЗ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рдФрд╕рдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ hostPerformingTimeMS рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред

рджреВрд╕рд░рд╛ рдЪрдХреНрд░
 for(int iJob=0; iJob<DATA_SIZE; iJob++) 

рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдХреБрдЫ рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреА рддрд░рд╣ рдЬреЛ рд╣рдо рд╕рднреА рд╣рд░ рджрд┐рди рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рд╣рдореЗрдВ рдЙрд╕реЗ рдУрдкрдирд╕реАрдПрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рддреБрд░рдВрдд рдЖрдкрдХреЛ MathCalculations рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдмрд╛рдК рд╣реИ:
рдлреНрд▓реЛрдЯ MathCalculations (рдлреНрд▓реЛрдЯ рдП, рдлреНрд▓реЛрдЯ рдмреА)
 float MathCalculations(float a, float b) { float res = 0; res += a*a*0.315f + b*0.512f + 0.789f; res += a*a*0.15f + b*0.12f + 0.789f; res += a*a*0.35f + b*0.51f + 0.89f; res += a*a*0.31f + b*0.52f + 0.7f; res += a*a*0.4315f + b*0.512f + 0.4789f; res += a*a*0.515f + b*0.132f + 0.7859f; res += a*a*0.635f + b*0.521f + 0.89f; res += a*a*0.731f + b*0.152f + 0.7f; res += a*a*0.1315f + b*0.512f + 0.789f; res += a*a*0.115f + b*0.12f + 0.789f; res += a*a*0.135f + b*0.51f + 0.89f; res += a*a*0.131f + b*0.52f + 0.7f; res += a*a*0.14315f + b*0.512f + 0.4789f; res += a*a*0.1515f + b*0.132f + 0.7859f; res += a*a*0.1635f + b*0.521f + 0.89f; res += a*a*0.1731f + b*0.152f + 0.7f; return res; } 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ (рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╢реБрджреНрдз рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕рд░рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ .cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХред

рднрд╛рдЧ рджреЛ - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдУрдкрдирд╕реАрдПрд▓


рдЗрд╕рд▓рд┐рдП, рд░реЛрдЧреА рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрд╢реА рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╢реБрд░реБрдЖрдд рдереА, рд▓реЗрдХрд┐рди рдЕрдзреАрд░ рдЗрд╕ рднрд╛рд╡рдирд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ :)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдУрдкрдирд╕реАрдПрд▓ рд░рдирдЯрд╛рдЗрдо рдПрдкреАрдЖрдИ рд╕реА рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ, рдФрд░ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ C ++ рд░реИрдкрд░ рднреА рд╣реИ (рдпрд╣ рдХреНрд░реЛрдиреЛрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдЬреЛ рдУрдкрдирд╕реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд░реНрдерди (рдЬреЛ рд╕рдВрджрд░реНрдн) рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд╡рд╛рдж (рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ #define __CL_ENABLE_EXCEPTPT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) )ред рдпрд╣ рдмрд╣реБрдд рдЖрд╡рд░рдг рдореИрдВ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЙрдкрд▓рдмреНрдз рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:
 vector<cl::Platform> platforms; cl::Platform::get(&platforms); 

рдУрдкрдирд╕реАрдПрд▓ рдореЗрдВ рдордВрдЪ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред NVidia рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдордВрдЪ рд╣реЛрдЧрд╛, Intel рджреВрд╕рд░рд╛, рдЖрджрд┐ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рджреЛ рдПрдирд╡реАрдбрд┐рдпрд╛ рдФрд░ рдЗрдВрдЯреЗрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдмрд╕ рдПрдХ рдФрд░ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓, C ++ рдЖрд╡рд░рдг рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ) рдпрд╛ рдПрд╕рдЯреАрдбреА рд╕реЗ рд╡реИрдХреНрдЯрд░, рддреЛ рдЕрдЧрд░ рдХреЛрдИ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреИрд╕реЗ cl :: рд╡реЗрдХреНрдЯрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдбрд░реЛ рдордд, рд╡рд╣ рджреЛрдиреЛрдВ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ ред

рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ:
 std::vector<cl::Device> devices; platforms[iPlatform].getDevices(CL_DEVICE_TYPE_ALL, &devices); 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдХрд░рдг рд╡реЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рдЧрдгрдирд╛ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдВрдЧреЗред рдпрд╣ рдПрдХ GPU, рдПрдХ рд╕реАрдкреАрдпреВ, рдпрд╛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рддреНрд╡рд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореЗрдЬрдмрд╛рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╕рд┐рд╕реНрдЯрдо рдЬрд┐рд╕ рдкрд░ OpenCL рдЪрд▓ рд░рд╣рд╛ рд╣реИред CL_DEVICE_TYPE_ALL рдХреЗ рдмрдЬрд╛рдп, рдЖрдк CL_DEVICE_TYPE_GPU рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдпрд╣ рдХреЗрд╡рд▓ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдпрд╛ CL_DEVICE_TYPE_CPU рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЙрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдУрдкрдирд╕реАрдПрд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ CheckResults рдЙрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдореЗрдЬрдмрд╛рди рдкрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдерд╛ рдФрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рддреНрд░реБрдЯрд┐рдпреЛрдВред

рднрд╛рдЧ рддреАрди - рдПрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдирд╛ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛


рдпрд╣рд╛рдВ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рдЧ рдкрд░ рдЖрддреЗ рд╣реИрдВ - рдЧрдгрдирд╛ред
рд╢реВрдиреНрдп PerformTestOnDevice (рд╕реАрдПрд▓ :: рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕)
 void PerformTestOnDevice(cl::Device device) { cout << endl << "-------------------------------------------------" << endl; cout << "Device: " << device.getInfo<CL_DEVICE_NAME>() << endl << endl; //For the selected device create a context vector<cl::Device> contextDevices; contextDevices.push_back(device); cl::Context context(contextDevices); //For the selected device create a context and command queue cl::CommandQueue queue(context, device); //Clean output buffers fill_n(pOutputVector, DATA_SIZE, 0); //Create memory buffers cl::Buffer clmInputVector1 = cl::Buffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pInputVector1); cl::Buffer clmInputVector2 = cl::Buffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pInputVector2); cl::Buffer clmOutputVector = cl::Buffer(context, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pOutputVector); //Load OpenCL source code std::ifstream sourceFile("OpenCLFile1.cl"); std::string sourceCode(std::istreambuf_iterator<char>(sourceFile),(std::istreambuf_iterator<char>())); //Build OpenCL program and make the kernel cl::Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length()+1)); cl::Program program = cl::Program(context, source); program.build(contextDevices); cl::Kernel kernel(program, "TestKernel"); //Set arguments to kernel int iArg = 0; kernel.setArg(iArg++, clmInputVector1); kernel.setArg(iArg++, clmInputVector2); kernel.setArg(iArg++, clmOutputVector); kernel.setArg(iArg++, DATA_SIZE); //Some performance measurement timeValues.clear(); __int64 start_count; __int64 end_count; __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); //Run the kernel on specific ND range for(int iTest=0; iTest<TESTS_NUMBER; iTest++) { QueryPerformanceCounter((LARGE_INTEGER*)&start_count); queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(DATA_SIZE), cl::NDRange(128)); queue.finish(); QueryPerformanceCounter((LARGE_INTEGER*)&end_count); double time = 1000 * (double)(end_count - start_count) / (double)freq; timeValues.push_back(time); } PrintTimeStatistic(); // Read buffer C into a local list queue.enqueueReadBuffer(clmOutputVector, CL_TRUE, 0, DATA_SIZE * sizeof(float), pOutputVector); } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 device.getInfo<CL_DEVICE_NAME>() 

рдЙрд╕реА рддрд░рд╣, рдЖрдк рдХреЛрд░, рдЖрд╡реГрддреНрддрд┐, рд╕рдВрд╕реНрдХрд░рдг, рдЖрджрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд┐рд░ рд╣рдо рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реИрдВ:
 vector<cl::Device> contextDevices; contextDevices.push_back(device); cl::Context context(contextDevices); 

рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ ... рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реАрдорд╛ рд╣реИ: рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдордВрдЪ рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд GPU рдФрд░ CPU рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ (Intel / NVidia рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдУрд░, рдпрд╣ рдорд▓реНрдЯреА-рдЬреАрдкреАрдпреВ рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рдХреЛрдИ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдХреИрд╕реЗ, рдХреНрдпрд╛ рдФрд░ рдХрдм рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рджрдХреНрд╖рддрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╣рдореЗрд╢рд╛ рдЬреНрдЮрд╛рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛, рдХрд╣рд╛рдБ, рдХрдм рд╣реЛрддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рдХрджрдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрддрд╛рд░ рдмрдирд╛рдирд╛ рд╣реИ:
 cl::CommandQueue queue(context, device); 

рдпрд╣ рдмрд╣реБрдд рдХрддрд╛рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рд╕реЗ рдмрдВрдзрд╛ рд╣реИ рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЖрдЙрдЯ рдСрдл рдСрд░реНрдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдХрддрд╛рд░реЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрддрд╛рд░реЛрдВ рд╕реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдореЗрдВред

рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░реНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
 //Create memory buffers cl::Buffer clmInputVector1 = cl::Buffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pInputVector1); cl::Buffer clmInputVector2 = cl::Buffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pInputVector2); cl::Buffer clmOutputVector = cl::Buffer(context, CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, DATA_SIZE * sizeof(float), pOutputVector); 

рдмрдлрд░ рдмрдирд╛рддреЗ рд╕рдордп, рд╕рдВрджрд░реНрдн (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрдЬрд╛рдп) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдорд╛рддреНрд░рд╛ рдФрд░, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ рдФрд░ CL_MEM_COPY_HOST_PTR рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдЬрд┐рд╕реЗ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, C ++ рд░реИрдкрд░ рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╢реБрджреНрдз C API рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдлрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб "OpenCLFile1.cl" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд╛рда рдкрдврд╝рддреЗ рд╣реИрдВ, рдПрдХ рдУрдкрдирд╕реАрдПрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ "рдЯреЗрд╕реНрдЯрдХрд░реНрдиреЗрд▓" рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
 cl::Program::Sources source(1, std::make_pair(sourceCode.c_str(), sourceCode.length()+1)); cl::Program program = cl::Program(context, source); program.build(contextDevices); cl::Kernel kernel(program, "TestKernel"); 

рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдпрдирд┐рдд рдЙрдкрдХрд░рдг рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рдирд╣реАрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЙрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред CUDA рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди (C ++ рд░реИрдкрд░, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рддрд░реНрдХ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
 int iArg = 0; kernel.setArg(iArg++, clmInputVector1); kernel.setArg(iArg++, clmInputVector2); kernel.setArg(iArg++, clmOutputVector); kernel.setArg(iArg++, DATA_SIZE); 

рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдкрд░ рдЖрддреЗ рд╣реИрдВ - рдХрд░реНрдиреЗрд▓ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг:
 queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(DATA_SIZE), cl::NDRange(128)); 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ queue.enqueueNDRangeKernel рдХрдорд╛рдВрдб рдХреА рдХрддрд╛рд░ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реНрдЯрд╛рд░реНрдЯ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд╕рд╛рде рд╣реА рд╕рдореВрд╣ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕рдореВрд╣реЛрдВ рдкрд░ рдЕрд▓рдЧ рд╕реЗ (рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ) рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕рднреА рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдореВрд╣ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ DATA_SIZE рд╣реИ, рдФрд░ рд╕рдореВрд╣ рдХрд╛ рдЖрдХрд╛рд░ 128 рд╣реИред рдХрд░реНрдиреЗрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЗрд╕реЗ DATA_SIZE рдмрд╛рд░ (рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ) рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, рдХрд┐рд╕ рддрддреНрд╡ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬреА рдЬрд╛рдПрдЧреАред
enqueueNDRangeKernel рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 queue.finish(); 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд┐рдирд┐рд╢ рджреЛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
1) рд╕рднреА рдХрдорд╛рдВрдб рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ (enqueueNDRangeK рдХрд░реНрдиреЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХрддрд╛рд░ рдореЗрдВ рдЦрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЪрд▓реЗрдЧрд╛, рдФрд░ рдЕрдХреНрд╕рд░ рдХрд░реНрдиреЗрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ)ред
2) рдХрддрд╛рд░ рдореЗрдВ рд╕рднреА рдЯреАрдореЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ред
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдкреБрд╢ (clFlush) рдХрдорд╛рдВрдб рд╣реИ рдЬреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд╛рд▓рдХ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдореЗрдЬрдмрд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:
 queue.enqueueReadBuffer(clmOutputVector, CL_TRUE, 0, DATA_SIZE * sizeof(float), pOutputVector); 

рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, enqueueReadBuffer рдЕрд╡рд░реБрджреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдХреЙрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд░рд▓ рд╣реИ: рдкрд╣рд▓рд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рдкрдврд╝рдирд╛ рд╣реИ, рдЪреМрдерд╛ рддрд░реНрдХ рдХрд┐рддрдирд╛ рдкрдврд╝рдирд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХрд╣рд╛рдВ рдкрдврд╝рдирд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореЗрдЬрдмрд╛рди рдкрд░ рдУрдкрдирд╕реАрдПрд▓ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рднрд╛рдЧ рдЪрд╛рд░ - рдУрдкрдирд╕реАрдПрд▓ рдХрд░реНрдиреЗрд▓ рдХреЛрдб


рдФрд░ рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╡рд╣ рд╕реНрдерд╛рди рдорд┐рд▓рд╛, рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдУрдкрдирд╕реАрдПрд▓ рдкрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕реЗ рдХреЛрдб рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП ... рд▓рд╛рдбрд╝ рдХрд░рдирд╛ :))ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ OpenCLFile1.cl рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 #include "MathCode.cpp" __kernel void TestKernel( __global const float* pInputVector1, __global const float* pInputVector2, __global float* pOutputVectorHost, int elementsNumber) { //Get index into global data array int iJob = get_global_id(0); //Check boundary conditions if (iJob >= elementsNumber) return; //Perform calculations pOutputVectorHost[iJob] = MathCalculations(pInputVector1[iJob], pInputVector2[iJob]); } 

рддреЛ рдХреНрд░рдо рдореЗрдВ:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ MathCode.cpp рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЧрдгрд┐рддреАрдп рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛ рдФрд░ рд╡рд╣реА рдЬреЛ рдореЗрдЬрдмрд╛рди рдкрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рднреА рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЧрдгрд┐рддреАрдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо __kernel рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдХрд░реНрдиреЗрд▓ рддрд░реНрдХ рдХреЛ __global рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рднреА рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╣реЛрд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред
рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ, рд╣рдореЗрдВ рдЙрд╕ рддрддреНрд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
 int iJob = get_global_id(0); 

Get_global_id рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдЖрдпрд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рддрддреНрд╡ 1, 2 рдпрд╛ 3-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо рд╕реАрдорд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:
 if (iJob >= elementsNumber) return; 

рдпрд╣ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ рд╕рдореВрд╣ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдФрд░ рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж, рд╣рдо рдореБрдЦреНрдп рднрд╛рдЧ рдХрд░рддреЗ рд╣реИрдВ: рдЧрдгрдирд╛, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рдореЗрдЬрдмрд╛рди рдкрд░:
 pOutputVectorHost[iJob] = MathCalculations(pInputVector1[iJob], pInputVector2[iJob]); 


рднрд╛рдЧ рдкрд╛рдВрдЪ - рдкрд░реАрдХреНрд╖рдг рдФрд░ рдорд╛рдк рдкреНрд░рджрд░реНрд╢рди


рддреЛ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ, рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдореИрдВрдиреЗ рджреЛ рдорд╢реАрдиреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗ:
рдиреЛрдЯрдмреБрдХ (CPU: Intel┬о Core тДв i7-820QM , GPU: NVidia Quadro FX 2800M ):
 Host: 959.256 ms CPU: 82.4163 ms (13.106X faster than host) GPU: 9.90836 ms (109.014X faster than host) 

рдбреЗрд╕реНрдХрдЯреЙрдк (CPU: Intel┬о Core тДв i7-2600 , GPU: NVidia GeForce GTX 580 )
 Host: 699.031 ms CPU: 27.7833 ms (25.159X faster than host) GPU: 2.06257 ms (338.897X faster than host) 

рдкреВрд░реНрдг рдкрд░рд┐рдгрд╛рдо
 Device: Host Calculation time statistic: (20 runs) Med: 959.256 ms (1.12602X faster than host) Avg: 1080.15 ms Min: 933.554 ms Max: 1319.19 ms ------------------------------------------------- Device: Quadro FX 2800M Calculation time statistic: (200 runs) Med: 9.90836 ms (109.014X faster than host) Avg: 10.7231 ms Min: 9.82841 ms Max: 135.924 ms Errors: avgRelAbsDiff = 5.25777e-008 maxRelAbsDiff = 5.83678e-007 ------------------------------------------------- Device: Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz Calculation time statistic: (200 runs) Med: 82.4163 ms (13.106X faster than host) Avg: 85.2226 ms Min: 79.4138 ms Max: 113.03 ms Errors: avgRelAbsDiff = 3.64332e-008 maxRelAbsDiff = 4.84797e-007 

 Device: Host Calculation time statistic: (20 runs) Med: 699.031 ms (0.999956X faster than host) Avg: 699.1 ms Min: 691.544 ms Max: 715.233 ms ------------------------------------------------- Device: GeForce GTX 580 Calculation time statistic: (200 runs) Med: 2.06257 ms (338.897X faster than host) Avg: 2.4 ms Min: 2.03873 ms Max: 82.0514 ms Errors: avgRelAbsDiff = 3.50006e-008 maxRelAbsDiff = 4.92271e-007 ------------------------------------------------- Device: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz Calculation time statistic: (200 runs) Med: 27.7833 ms (25.159X faster than host) Avg: 27.49 ms Min: 27.0154 ms Max: 35.8386 ms Errors: avgRelAbsDiff = 3.64377e-008 maxRelAbsDiff = 4.89584e-007 



рддреЛ, рдЪрд▓реЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо, рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛, рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИрдВред рд▓реИрдкрдЯреЙрдк рдкрд░ GPU рд╣реЛрд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ ~ 110X рддреЗрдЬ рд╣реИ, рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдпрд╣ ~ 340X рддреЗрдЬ, рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдореБрдЭ рдкрд░ рдЪрдкреНрдкрд▓ рдлреЗрдВрдХрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддреБрд▓рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдВ рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рдПрдХ рддрд░рдл, рдпрд╣ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдЪреАрдЬ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЗрддрдирд╛ рд╣рд░реНрд╖рдЬрдирдХ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдирдХрд▓ рдХреЛ рдПрдХ рд╕рд╛рде рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реЛред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╕реЗ рджреВрд░ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЧрдгрд┐рдд рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛? рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рд░рд▓ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╕реЗ рдирд┐рдХрд▓рд╛ рдФрд░ рдЧреБрдгрд╛рдВрдХ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реВ рдореЗрдВ рдпрд╣ рд╕рд░рд▓ рдерд╛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓реЗ рдЧрдпрд╛, рдХреЗрд╡рд▓ рдЬрдм рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдо рдЗрддрдиреЗ рдЦреБрд╢ рдирд╣реАрдВ рдереЗ, GPU рдХреЗрд╡рд▓ 4-5 рдЧреБрдирд╛ рддреЗрдЬ рдерд╛ред рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ? (рдПрдХ рд▓рдлреНрдлрд╛рдЬреА рд╡рд╛рд▓рд╛ рд╕рд╡рд╛рд▓, рдЖрдк рд╕реЛрдЪ рднреА рдирд╣реАрдВ рд╕рдХрддреЗ :))ред рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдо рд╕реНрдореГрддрд┐ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рднрд╛рдЧ рдЧрдПред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рд╣рд╛рде рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдореИрдВ рдореЗрдореЛрд░реА рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдкрд░реАрдХреНрд╖рдг рдорд┐рд▓рд╛ред

рдЗрди рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╢реБрджреНрдз рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдкрд░ рдЧреИрд░-рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬреАрдкреАрдпреВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрдВрддрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред (рдПрдХ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рджреВрд╕рд░реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ)ред

рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ GPU рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕реАрдкреАрдпреВ OpenCL рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде MSVC10 рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 13X рдФрд░ 25X рддреЗрдЬ рд╣реИред рдЖрдЗрдП рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдФрд░ рдпреЗ рдирдВрдмрд░ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

рджреЛрдиреЛрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ 4 рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ 8 рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛрд░ рд╣реИрдВ, рдФрд░ рдУрдкрдирд╕реАрдПрд▓ рд╕рд┐рд░реНрдл рд╕рднреА рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4X рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрдзрд╛рд░ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдореБрдЭреЗ рдЗрдВрдЯреЗрд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдиреЗ рдУрдкрдирд╕реАрдПрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛, рдЕрд░реНрдерд╛рддред рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ, OpenCL SSE рдпрд╛ AVX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 128-рдмрд┐рдЯ SSE рд╣реИ, рдФрд░ AVX 256-рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреНрд░рдорд╢рдГ 16X рдФрд░ 32X рддрдХ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд░реАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЯреАрдХ рд╕рдВрдпреЛрдЧ рдирд╣реАрдВ рд╣реИред рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ TurboBoost рдЬреИрд╕реА рдЖрдирдВрджрджрд╛рдпрдХ рдЪреАрдЬрд╝ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ 1.73 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ / 3.06 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ (рд▓реИрдкрдЯреЙрдк) рдФрд░ 3.4 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ / 3.8 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ (рдбреЗрд╕реНрдХрдЯреЙрдк) рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реИрдкрдЯреЙрдк рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЖрд╡реГрддреНрддрд┐ 1.73 рд╕реЗ 2.8 рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдХреВрджрддреА рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рдЧрд░реНрдо рд╣реЛрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдШреБрдорд╛рд╡рджрд╛рд░ рд╢реАрддрд▓рди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдбреЗрд▓ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рдХреИрдорд┐рдпреЛ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП), рдЗрд╕рд▓рд┐рдП 3.06GHz рдЖрд╡реГрддреНрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордп рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╕реЗ рдХрдо рд╣реИ (рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ), рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, 25X рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдПрдХ рд╣реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рд▓рдЧрднрдЧ рдореБрдлреНрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓рдХреНрд╖реНрдп OpenCL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ ( рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдЖрджрд░реНрд╢ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЖрдк рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рд▓рдЧрднрдЧ рдЖрджрд░реНрд╢ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

рдкреБрдирд╢реНрдЪ: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрддреЗ рд╣реИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдХрдЯреНрдареЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп) рдЧреАрдердм рдкрд░ рд╕реНрдерд┐рдд рд╣реИ ред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ OpenCL SDK рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

PS2: рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрдЗрд╡реА рдмреНрд░рд┐рдЬ рд╣реИ, рддреЛ рдПрдХреАрдХреГрдд рд╡реАрдбрд┐рдпреЛ рдХреЛрд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрдирд╕реАрдПрд▓ рдПрд╕рдбреАрдХреЗ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрдВрдЯреЗрд▓ рдиреЗ рдЖрдИрдЬреАрдкреА рддрдХ рдкрд╣реБрдВрдЪ рдЦреЛрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдкреАрдврд╝реА рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдПрдПрдордбреА рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред

Source: https://habr.com/ru/post/In146823/


All Articles