рдПрдПрдордбреА рдПрдкреАрдкреА рдПрд╕рдбреАрдХреЗ: рдХрдВрдкреНрдпреВрдЯ рдПрдмреНрд╕реНрдЯреНрд░рдХреНрд╢рди рд▓реЗрдпрд░ (рд╕реАрдПрдПрд▓)

AMD рдПрдкреАрдкреА рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ AMD рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд▓реИрдВрдЧреНрд╡реЗрдЬ (IL) рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдпрд╣ рд▓реЗрдЦ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реАрд░реНрд╖рдХ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ: рдПрдПрдордбреА рдХрдВрдкреНрдпреВрдЯ рдПрдмреНрд╕реНрдЯреНрд░реЗрдХреНрд╢рди рд▓реЗрдпрд░ (рд╕реАрдПрдПрд▓)ред рдпреЗ рджреЛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд╡рд┐рднрд╛рдЬреНрдп рд╣реИрдВ: рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдЧреЗ рдХреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред

рдореИрдВ AMD GPU рдХреЗ рд╕рд╛рде рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдЗрд╕ рддрдХрдиреАрдХ рдХреА рд╕реАрдорд╛рдУрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ, рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп


рдЬрдм рдореИрдВ рдПрдПрдордбреА рдЬреАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред "рдЕрддрд┐ рдХреИрд▓, " рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред "рд╣рд╛рдБ, рдЕрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдПрдПрд▓ рд╣реИ, " рдореЗрд░рд╛ рдЬрд╡рд╛рдм рдерд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо CAL рдХрд╛ рдЙрдЪреНрдЪрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ "O" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рд╢рд░реНрдорд┐рдВрджрд╛ рди рдХрд░реЗрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдХрд░реНрдиреЗрд▓ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ GPU рдкрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрдХрд▓рд┐рдд, рдмрд╛рдЗрдирд░реА рдХреЛрдб рджреЛрдиреЛрдВ рд╕реЗ рд╣реЛрдЧрд╛ред рдореИрдВ AMD CAL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдХрд╛рдо рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ:

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ AMD APP SDK рд╕реЗ рджреЛ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдЪрд╛рд╣рд┐рдП:

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

рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдХреИрд▓рд░реЗрд╕рд▓реНрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдХреБрд▓ 11 рд░рд┐рдЯрд░реНрди рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб CAL_RESULT_OK рд╣реИ, 0 рдХреЗ рдмрд░рд╛рдмрд░ (рдХреЙрд▓ рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред

рдЪрд╛рд▓рдХ рдХрд╛ рдЖрд░рдореНрдн


рдирд┐рдпрдо рдирдВрдмрд░ 1: GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдкрдиреЗ рд╣рд╛рде рдзреЛ рд▓реЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ:
CALresult result = calInit(); 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 2: GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреБрд▓реНрд▓рд╛ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 CALresult result = calShutdown(); 

рдЗрди рджреЛ рдХреЙрд▓ рдХреЛ рд╣рдореЗрд╢рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ (рдРрд╕реЗ рдЬреЛрдбрд╝реЗ рдХреЙрд▓) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдХреЙрд▓реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдХрднреА рднреА рдХрд╛рдо рди рдХрд░реЗрдВ: рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

GPU рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рд╣рдореЗрдВ рд╕рдорд░реНрдерд┐рдд GPU рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ (рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ AMD GPU рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ):
 unsigned int deviceCount = 0; CALresult result = calDeviceGetCount( &deviceCount ); 

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ GPU рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 0. рдХреЗ рддрд╣рдд GPU рдХреЗ рд╕рд╛рде "рдХрд╛рдо" рдХрд░реВрдВрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 0 рд╕реЗ (рдбрд┐рд╡рд╛рдЗрд╕рдХрд╛рдЙрдВрдЯ -1) рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред

GPU рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
 unsigned int deviceId = 0; //  GPU CALdeviceinfo deviceInfo; CALresult result = calDeviceGetInfo( &deviceInfo, deviceId ); CALdeviceattribs deviceAttribs; deviceAttribs.struct_size = sizeof( deviceAttribs ); CALresult result = calDeviceGetAttribs( &deviceAttribs, deviceId ); 

CALdeviceinfo рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд GPU рдЪрд┐рдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИред рдЗрд╕реЗ рдпрд╣рд╛рдБ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд░реНрдиреЗрд▓ ISA рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ :
 typedef struct CALdeviceinfoRec { CALtarget target; /**< Device Kernel ISA */ CALuint maxResource1DWidth; /**< Maximum resource 1D width */ CALuint maxResource2DWidth; /**< Maximum resource 2D width */ CALuint maxResource2DHeight; /**< Maximum resource 2D height */ } CALdeviceinfo; 

рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдмрдирд╛рд╡рдЯ рд╕реНрдореГрддрд┐ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдЬреАрдкреАрдпреВ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

GPU рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ CALdeviceattribs рд╕рдВрд░рдЪрдирд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ (рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рджреВрдВрдЧрд╛):
 typedef struct CALdeviceattribsRec { CALtarget target; /**< Asic identifier (  Device Kernel ISA) */ CALuint localRAM; /**<   GPU RAM   */ CALuint wavefrontSize; /**<  warp'a (      ) */ CALuint numberOfSIMD; /**<   */ CALboolean computeShader; /**<   Compute Shader */ CALuint pitch_alignment; /**<        calCreateRes */ /*   */ } CALdeviceattribs; 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 3: CALdeviceattribs.pitch_alignment рдлрд╝реАрд▓реНрдб рдХреЛ рдореЗрдореЛрд░реА рддрддреНрд╡реЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВред рдореЗрдореЛрд░реА рддрддреНрд╡ 8-, 16- рдпрд╛ 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ 1-, 2- рдпрд╛ 4-рдШрдЯрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИред

рдФрд░ рдЕрдм рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ CALdeviceinfo.target рдлрд╝реАрд▓реНрдб (CALdeviceattribs.target) рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 /** Device Kernel ISA */ typedef enum CALtargetEnum { CAL_TARGET_600, /**< R600 GPU ISA */ CAL_TARGET_610, /**< RV610 GPU ISA */ CAL_TARGET_630, /**< RV630 GPU ISA */ CAL_TARGET_670, /**< RV670 GPU ISA */ CAL_TARGET_7XX, /**< R700 class GPU ISA */ CAL_TARGET_770, /**< RV770 GPU ISA */ CAL_TARGET_710, /**< RV710 GPU ISA */ CAL_TARGET_730, /**< RV730 GPU ISA */ CAL_TARGET_CYPRESS, /**< CYPRESS GPU ISA */ CAL_TARGET_JUNIPER, /**< JUNIPER GPU ISA */ CAL_TARGET_REDWOOD, /**< REDWOOD GPU ISA */ CAL_TARGET_CEDAR, /**< CEDAR GPU ISA */ CAL_TARGET_RESERVED0, CAL_TARGET_RESERVED1, CAL_TARGET_WRESTLER, /**< WRESTLER GPU ISA */ CAL_TARGET_CAYMAN, /**< CAYMAN GPU ISA */ CAL_TARGET_RESERVED2, CAL_TARGET_BARTS, /**< BARTS GPU ISA */ } CALtarget; 

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝реАрд▓реНрдб рдЙрд╕ рдЪрд┐рдк рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ GPU рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ GPU рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Radeon HD 3850) AMD CAL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ! рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдХрдиреАрдХ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Radeon HD 5750 рдФрд░ Radeon HD 6750 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╣реИрдВ! рд╡реЗ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдСрдкрд░реЗрд╢рди рдХреА рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ (рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рднреАрддрд░) рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

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

рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рдбрд┐рд╡рд╛рдЗрд╕) рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо GPU рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗ:
 unsigned int deviceId = 0; //  GPU CALdevice device; CALresult result = calDeviceOpen( &device, deviceId ); CALcontext context; result = calCtxCreate( &context, device ); 

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

рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпреБрдЧреНрдорд┐рдд рдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛:
 calCtxDestroy( context ); calDeviceClose( device ); 

рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдХреЙрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдореЗрдВ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ ред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рд╡рд╛рдЗрд╕ рдФрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рдпрд╛, рдЕрдм рд╣рдо рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди


рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА (рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА = рд╕реНрдЯреНрд░реАрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА) рдФрд░ рд░рд┐рдореЛрдЯ рдореЗрдореЛрд░реА (рд░рд┐рдореЛрдЯ рдореЗрдореЛрд░реА = рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА) рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд░рд┐рдореЛрдЯ рдореЗрдореЛрд░реА рд░реИрдо рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдерд╛рдиреАрдп рдореЗрдореЛрд░реА рд╕реНрд╡рдпрдВ GPU рдХреА рдореЗрдореЛрд░реА рд╣реИред

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

 CALresource resource; unsigned int memoryWidth; unsigned int memoryHight; CALformat memoryFormat; unsigned int flags; //      // 1D  CALresult result = calResAllocRemote1D( &resource, &device, 1, memoryWidth, memoryFormat, flags ); /*         GPU,    -     ,   -      (1   ) */ // 2D  CALresult result = calResAllocRemote2D( &resource, &device, 1, memoryWidth, memoryHeight, memoryFormat, flags ); //      // 1D  CALresult result = calResAllocLocal1D( &resource, device, memoryWidth, memoryFormat, flags ); /*  ,       ,       */ // 2D  CALresult result = calResAllocLocal2D( &resource, device, memoryWidth, memoryHeight, memoryFormat, flags ); 

рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЛ рд╕реНрдореГрддрд┐ рддрддреНрд╡реЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЗрдореЛрд░реА рддрддреНрд╡ рдХреЛ рдореЗрдореЛрд░реАрдлреЙрд░реНрдо рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 //  ,         /** Data format representation */ typedef enum CALformatEnum { CAL_FORMAT_UNORM_INT8_1, /**< 1 component, normalized unsigned 8-bit integer value per component */ CAL_FORMAT_UNORM_INT8_4, /**< 4 component, normalized unsigned 8-bit integer value per component */ CAL_FORMAT_UNORM_INT32_1, /**< 1 component, normalized unsigned 32-bit integer value per component */ CAL_FORMAT_UNORM_INT32_4, /**< 4 component, normalized unsigned 32-bit integer value per component */ CAL_FORMAT_SNORM_INT8_1, /**< 1 component, normalized signed 8-bit integer value per component */ CAL_FORMAT_SNORM_INT8_4, /**< 4 component, normalized signed 8-bit integer value per component */ CAL_FORMAT_SNORM_INT32_1, /**< 1 component, normalized signed 32-bit integer value per component */ CAL_FORMAT_SNORM_INT32_4, /**< 4 component, normalized signed 32-bit integer value per component */ CAL_FORMAT_UNSIGNED_INT8_1, /**< 1 component, unnormalized unsigned 8-bit integer value per component */ CAL_FORMAT_UNSIGNED_INT8_4, /**< 4 component, unnormalized unsigned 8-bit integer value per component */ CAL_FORMAT_SIGNED_INT8_1, /**< 1 component, unnormalized signed 8-bit integer value per component */ CAL_FORMAT_SIGNED_INT8_4, /**< 4 component, unnormalized signed 8-bit integer value per component */ CAL_FORMAT_UNSIGNED_INT32_1, /**< 1 component, unnormalized unsigned 32-bit integer value per component */ CAL_FORMAT_UNSIGNED_INT32_4, /**< 4 component, unnormalized unsigned 32-bit integer value per component */ CAL_FORMAT_SIGNED_INT32_1, /**< 1 component, unnormalized signed 32-bit integer value per component */ CAL_FORMAT_SIGNED_INT32_4, /**< 4 component, unnormalized signed 32-bit integer value per component */ CAL_FORMAT_UNORM_SHORT_565, /**< 3 component, normalized 5-6-5 RGB image. */ CAL_FORMAT_UNORM_SHORT_555, /**< 4 component, normalized x-5-5-5 xRGB image */ CAL_FORMAT_UNORM_INT10_3, /**< 4 component, normalized x-10-10-10 xRGB */ CAL_FORMAT_FLOAT32_1, /**< A 1 component, 32-bit float value per component */ CAL_FORMAT_FLOAT32_4, /**< A 4 component, 32-bit float value per component */ CAL_FORMAT_FLOAT64_1, /**< A 1 component, 64-bit float value per component */ CAL_FORMAT_FLOAT64_2, /**< A 2 component, 64-bit float value per component */ } CALformat; 

рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб (рдПрд╡рд░рдЧреНрд░реАрди рдирд╣реАрдВ) рдкрд░ 64-рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 4: рддрддреНрд╡ рдкреНрд░рд╛рд░реВрдк рдХреЗрд╡рд▓ рдЙрд╕реА рддрд░реАрдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ GPU рдЗрд╕ рддрддреНрд╡ рдореЗрдВ рдкрдбрд╝реЗ рдбреЗрдЯрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рддрддреНрд╡ рд╣рдореЗрд╢рд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред

рдЗрд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ:
 dcl_resource_id(0)_type(2d,unnorm)_fmtx(uint)_fmty(uint)_fmtz(uint)_fmtw(uint) 

рдФрд░ рдПрдПрдордбреА рдЖрдИрдПрд▓ рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, fmtx-fmtw рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдирд┐рдореНрди рдХреЛрдб (рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ 1-рдШрдЯрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ) рдЧрд▓рдд рд╣реИ:
 dcl_resource_id(0)_type(2d,unnorm)_fmtx(uint) 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 5: рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордпред рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдмрд╛рдБрдз рдирд╣реАрдВ рд╕рдХрддреЗред

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 6: рдирд┐рд░рдВрддрд░ рд╕реНрдореГрддрд┐ рдХреЗ рд▓рд┐рдП, рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдлреНрд▓реЛрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЛ рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА (рдЬреЛ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ) рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╢рдмреНрдж:
 /** CAL resource allocation flags **/ typedef enum CALresallocflagsEnum { CAL_RESALLOC_GLOBAL_BUFFER = 1, /**< used for global import/export buffer */ CAL_RESALLOC_CACHEABLE = 2, /**< cacheable memory? */ } CALresallocflags; 

рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдХрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬрдм рдпрд╣ рдлрд╛рдпрджрд╛ рджреЗрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдФрд░ рдЦреБрдж рд▓реЗрдЦрдХреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡реЗ рднреА рдкрддрд╛ рдирд╣реАрдВ (рдореБрд╕реНрдХрд╛рди) рдореЗрдВ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЭрдВрдбреЗ рдХреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдмрдлрд░ ("рдЬреА []") рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдм рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдПрдВред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдордиреЗ рдХрд░реНрдиреЗрд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рд╣реИрдВ:
 unsigned int blocks = 4; //  4  unsigned int threads = 64; //  64    //    cb0 CALresource constantResource; CALresult result = calResAllocLocal1D( &constantResource, device, 1, CAL_FORMAT_FLOAT32_4, 0 ); //    i0 CALresource textureResource; result = calResAllocLocal2D( &textureResource, device, threads, blocks, CAL_FORMAT_UNSIGNED_INT32_4, 0 ); //    g[] CALresource globalResource; result = calResAllocLocal1D( &globalResource, device, threads * blocks, CAL_FORMAT_UNSIGNED_INT32_4, CAL_RESALLOC_GLOBAL_BUFFER ); 

рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
 calResFree( constantResource ); calResFree( textureResource ); calResFree( globalResource ); 

рд╕реНрдореГрддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ


рд╕реНрдореГрддрд┐ рддрдХ рд╕реАрдзреА рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдпрджрд┐ GPU рдЕрдкрдиреА рдореЗрдореЛрд░реА рдХреЛ рдореИрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдореИрдк рдХрд░ рд░рд╣рд╛ рд╣реИ), рддреЛ рд╣рдо рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдореЗрдореЛрд░реА:
 unsigned int pitch; unsigned char* mappedPointer; CALresult result = calResMap( (CALvoid**)&mappedPointer, &pitch, resource, 0 ); //    ,   ,    

рдФрд░ рд╣рдо рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕реВрдЪрдХ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 CALresult result = calResUnmap( resource ); 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 7: рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ GPU рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╕рдВрд░реЗрдЦрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рдВрд░реЗрдЦрдг рдЪрд░ рдкрд┐рдЪ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 8: рдкрд┐рдЪ рдХреЛ рддрддреНрд╡реЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдирд╣реАрдВред

рдЖрдкрдХреЛ рдЗрд╕ рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐, рд░реИрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, GPU рдореЗрдореЛрд░реА рд╣рдореЗрд╢рд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЬрдм рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЙрджрд╛рд╣рд░рдг рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ: рдпрджрд┐ рдЖрдк 100x100 рддрддреНрд╡реЛрдВ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ calResMap () рдлрд╝рдВрдХреНрд╢рди рдиреЗ 200 рдХрд╛ рдкрд┐рдЪ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ GPU 200x100 рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдмрд╕ рдкрд╣рд▓реЗ 100 рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рд╡рдЯ рд▓рд╛рдЗрди рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рддрддреНрд╡реЛрдВред

рдкрд┐рдЪ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ GPU рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 unsigned int pitch; unsigned char* mappedPointer; unsigned char* dataBuffer; CALresult result = calResMap( (CALvoid**)&mappedPointer, &pitch, resource, 0 ); unsigned int width; unsigned int height; unsigned int elementSize = 16; if( pitch > width ) { for( uint index = 0; index < height; ++index ) { memcpy( mappedPointer + index * pitch * elementSize, dataBuffer + index * width * elementSize, width * elementSize ); } } else { memcpy( mappedPointer, dataBuffer, width * height * elementSize ); } 

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмрдлрд╝рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рддрддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рддрддреНрд╡ рдореЗрдВ рд╣рдореЗрд╢рд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
рдЕрд░реНрдерд╛рдд, CAL_FORMAT_UNSIGNED_INT16_2 рдкреНрд░рд╛рд░реВрдк рдХреЗ рдПрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдореЗрдВ рдЗрд╕рдХрд╛ рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:
 // w - word, 16  // wi.j - i- word, j-  // x -  [ w0.0 | w0.1 | x | x ][ w1.0 | w1.1 | x | x ][ x | x | x | x ][ x | x | x | x ] 

рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ


рдбреЗрдЯрд╛ рд╕реАрдзреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрд▓реНрд╡реЗрдВрдЯ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 CALresource inputResource; CALresource outputResource; CALmem inputResourceMem; CALmem outputResourceMem; //     CALresult result = calCtxGetMem( &inputResourceMem, context, inputResource ); result = calCtxGetMem( &outputResourceMem, context, outputResource ); //   CALevent syncEvent; result = calMemCopy( &syncEvent, context, inputResourceMem, outputResourceMem, 0 ); //    ,   ,    //     while( calCtxIsEventDone( context, syncEvent ) == CAL_RESULT_PENDING ); 

GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд▓реЛрдб рдХрд░рдирд╛


"рдПрдХ рд╕реБрдИ рдореЗрдВ рдХреЛрд╢реЗ рдХреА рдореМрдд, рдПрдХ рдЕрдВрдбреЗ рдореЗрдВ рдПрдХ рд╕реБрдИ, рдПрдХ рдмрддрдЦ рдореЗрдВ рдПрдХ рдЕрдВрдбрд╛, рдПрдХ рдмрддрдЦ рдореЗрдВ рдПрдХ рдмрддрдЦ, рдПрдХ рдЫрд╛рддреА рдореЗрдВ рдПрдХ рдЦрд░рдЧреЛрд╢ ..."

GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕реНрд░реЛрдд (txt) рдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ (рдСрдмреНрдЬреЗрдХреНрдЯ) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯрд░реНрд╕ рдХреЛ рдПрдХ рдЗрдореЗрдЬ (рдЗрдореЗрдЬ) рдореЗрдВ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ GPU рдореЙрдбреНрдпреВрд▓ (рдореЙрдбреНрдпреВрд▓) рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдореЙрдбреНрдпреВрд▓ рдХрд░реНрдиреЗрд▓ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ (рдпрд╣ рд╕реВрдЪрдХ рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред

рдФрд░ рдЕрдм, рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
 const char* kernel; //       // ,   GPU  unsigned int deviceId = 0; //  GPU CALdeviceinfo deviceInfo; CALresult result = calDeviceGetInfo( &deviceInfo, deviceId ); //   CALobject obj; result = calclCompile( &obj, CAL_LANGUAGE_IL, kernel, deviceInfo.target ); //     CALimage image; result = calclLink( &image, &obj, 1 ); //   -  ,  -   //     ,   result = calclFreeObject( obj ); //     CALmodule module; result = calModuleLoad( &module, context, image ); //      CALfunc function; result = calModuleGetEntry( &function, context, module, "main" ); 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 9: рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ - "рдореБрдЦреНрдп" рдлрд╝рдВрдХреНрд╢рдиред

рдЕрд░реНрдерд╛рдд, Nvidia CUDA рдХреЗ рд╡рд┐рдкрд░реАрдд, AMD CAL рдХреЛрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди "рдореБрдЦреНрдп" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗрд╡рд▓ IL рдореЗрдВ рд▓рд┐рдЦреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЛ рдЪрдпрдирд┐рдд GPU рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрдгрд┐рдд рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЬреАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдм 2 рдПрдХ рд╣реА рдЬреАрдкреАрдпреВ рд╣реИрдВ: рдпрд╣ рдПрдХ рдмрд╛рд░ рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред

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

GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛:
 CALresult result = calclFreeImage( image ); result = calModuleUnload( context, module ); 

рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ


рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░рдирд╛


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрд╕рд╛рдзрди, рдкреВрд░реНрдг рдореЗрдореЛрд░реА рдФрд░ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░реНрдиреЗрд▓ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрд░ рд╕реЗ рдмрд╛рдВрдзрдиреЗ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореИрдк рдХрд░реЗрдВред
 const char* memoryName; //    ,       //      CALname kernelParameter; CALresult result = calModuleGetName( &kernelParameter, context, module, memoryName ); //     CALmem resourceMem; result = calCtxGetMem( &resourceMem, context, resource ); //         result = calCtxSetMem( context, kernelParameter, resourceMem ); 

рдФрд░ рдЕрдм рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:
 CALname kernelParameter; CALmem resourceMem; //      CALresult result = calModuleGetName( &kernelParameter, context, module, "cb0" ); result = calCtxGetMem( &resourceMem, context, constantResource ); result = calCtxSetMem( context, kernelParameter, resourceMem ); //      result = calModuleGetName( &kernelParameter, context, module, "i0" ); result = calCtxGetMem( &resourceMem, context, textureResource ); result = calCtxSetMem( context, kernelParameter, resourceMem ); //      result = calModuleGetName( &kernelParameter, context, module, "g[]" ); result = calCtxGetMem( &resourceMem, context, globalResource ); result = calCtxSetMem( context, kernelParameter, resourceMem ); 

GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрд░реНрдиреЗрд▓ рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдирдЯрд╛рдЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 CALname kernelParameter; //      CALresult result = calModuleGetName( &kernelParameter, context, module, "cb0" ); result = calCtxSetMem( context, kernelParameter, 0 ); //      result = calModuleGetName( &kernelParameter, context, module, "i0" ); result = calCtxSetMem( context, kernelParameter, 0 ); //      result = calModuleGetName( &kernelParameter, context, module, "g[]" ); result = calCtxSetMem( context, kernelParameter, 0 ); 

рдЕрдм рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд╣реИ:

рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдореИрдВрдиреЗ PS рдФрд░ CS рд╢реЗрдбреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред рдЖрдк рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз GPU рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред

рдкреБрдирд╢реНрдЪ рд▓реЙрдиреНрдЪ:
 unsigned int blocks = 4; //  4  unsigned int threads = 64; //  64    CALdomain domain; domain.x = 0; domain.y = 0; domain.width = threads; domain.height = blocks; CALevent syncEvent; CALresult result = calCtxRunProgram( &syncEvent, context, function, &domain ); while( calCtxIsEventDone( context, syncEvent ) == CAL_RESULT_PENDING ); 

рдпрд╣рд╛рдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд░реНрдиреЗрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рд╣рдореЗрдВ GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ (рдКрдкрд░ "GPU рдкрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд▓реЛрдб рдХрд░рдирд╛" рджреЗрдЦреЗрдВ)ред

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 10: PS рдХреЛ рдзрд╛рдЧреЗ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдореЗрдореЛрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдирд┐рд░рдВрддрд░ рдореЗрдореЛрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рд╕реАрдПрд╕ рд▓реЙрдиреНрдЪ:
 unsigned int blocks = 4; //  4  unsigned int threads = 64; //  64    CALprogramGrid programGrid; programGrid.func = function; programGrid.flags = 0; programGrid.gridBlock.width = threads; programGrid.gridBlock.height = 1; programGrid.gridBlock.depth = 1; programGrid.gridSize.width = blocks; programGrid.gridSize.height = 1; programGrid.gridSize.depth = 1; CALevent syncEvent; CALresult result = calCtxRunProgramGrid( &syncEvent, context, &programGrid ); while( calCtxIsEventDone( context, syncEvent ) == CAL_RESULT_PENDING ); 

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 11: рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдорд╛рди рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЯреВрдЯреЗ рд╣реБрдП рдореВрд▓реНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд░реНрдиреЗрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдпрд╛ рддреЛ рдореЗрдореЛрд░реА рдХреА рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдХрдо рдереНрд░реЗрдб рдХреА рд▓реЙрдиреНрдЪрд┐рдВрдЧ), рдпрд╛ рд╕рднреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рдХрд╛ рд▓реЙрдиреНрдЪ)ред

рд╣реЛ рдЧрдпрд╛! рдХрд░реНрдиреЗрд▓ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдореЛрд░реА ("рдЬреА []") рдореЗрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ (рдКрдкрд░ "рдореЗрдореЛрд░реА рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛" рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ)ред

рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рдЬреЛ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
 CALresult result; //     CALdevicestatus status; result = calDeviceGetStatus( &status, device ); //      GPU  result = calCtxFlush( context ); //       ( ) CALfunc function; CALfuncInfo functionInfo; result = calModuleGetFuncInfo( &functionInfo, context, module, function ); /*      ,       (     ,      ) */ //        aticalrt.dll const char* errorString = calGetErrorString(); //        aticalcl.dll () const char* errorString = calclGetErrorString(); 

рдХреНрд░реЙрд╕-рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди


рдПрдирд╡реАрдбрд┐рдпрд╛ рдХреНрдпреВрдбрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рд╣реИрдВред

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 12: CAL рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ ред рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░, рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧрд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдпрдо 13: рдореБрдЦреНрдп рд╕реАрдПрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн / рдЙрдкрдХрд░рдг рд╡рд┐рд╡рд░рдгрдХ (рд╕рдВрджрд░реНрдн / рдЙрдкрдХрд░рдг) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдп рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ ред

рдирд┐рдпрдо рд╕рдВрдЦреНрдпрд╛ 14: рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡реЗрджрди рдзрд╛рдЧрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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


рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╕реБрд▓рдн рддрд░реАрдХреЗ рд╕реЗ рдПрдПрдордбреА рд╕реАрдПрдПрд▓ рдФрд░ рдПрдПрдордбреА рдЖрдИрдПрд▓ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА , рддрд╛рдХрд┐ рдХреЛрдИ рднреА рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рдЧрднрдЧ рдПрдПрдордбреА рдЬреАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд╕рдХреЗред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реБрдирд╣рд░рд╛ рдирд┐рдпрдо рдпрд╛рдж рд░рдЦреЗрдВ: RTFM!

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрдврдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрд╛ рд╣реЛрдЧрд╛

рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ


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


All Articles