ã³ã³ãã€ã©
ãŸã第äžã«ãåé¡ã¯ãã³ãŒãèªäœãã©ãã«æžããã§ãã ç§ãç¥ãéãã.NETã«ã¯ãã¹ã¿ãžãªã§ã«ãŒãã«ã³ãŒããçŽæ¥åŠçããããã®whiã¯ãããŸããã ãããã£ãŠããµãŒãããŒãã£ã®ãšãã£ã¿ãŒã䜿çšããå¿ èŠããããŸãã AMDãnVidiaãããã³Intelã¯ããããã®SDKããã³ãã«ããŠããŸãã äœããã®çç±ã§ãIntelovskyã®æ¹ã奜ãã§ãã ãªãã·ã§ã³ãšããŠããã¡ã³ã«ãã£ãŠæžãããããã€ãã®ãšãã£ã¿ãŒããããŸãã ãããã®ãã¡ãç§ã¯OpenCLTemplateã«æãä»å±ããŠãããšãã£ã¿ãŒã奜ãã§ãã ããããç·šéè ã§ããããšã¯æ³šç®ã«å€ããŸãã ã³ãŒãã®ã³ã³ãã€ã«ã¯ãGPU / CPUã§å®è¡ããçŽåã«çºçããŸãã
ããã€ã¹ã¡ã¢ãªã¢ãã«

èšèªèªäœã説æããåã«ã察話ããããã€ã¹ã®ç©çã¢ãã«ã«ã€ããŠç°¡åã«èª¬æããŸãã èšèªã³ãã³ãã¯ããã¯ãŒã¯ã¢ã€ãã ããšåŒã°ãããªããžã§ã¯ãã§å®è¡ãããŸãã åãäœæ¥é ç®ãã¯äºãã«ç¬ç«ããŠãããæ®ããšäžŠè¡ããŠã³ãŒããå®è¡ã§ããŸãã ããã»ã¹ãã䜿çšäžã®ã¯ãŒã¯ã¢ã€ãã ãŸãã¯ä»ã®ã¯ãŒã¯ã¢ã€ãã ã«ãã£ãŠãã§ã«åŠçãããã¯ãŒã¯ã¢ã€ãã ããããŒã¿ãåä¿¡ããå Žåãå ±æã¡ã¢ãªãä»ããŠãããå®è¡ã§ããŸãã åèšã¡ã¢ãªã¯éåžžã«é ããªããŸããã倧éã«ãããŸãã èšç®ãé«éåããããã«ãããŒã«ã«ã¡ã¢ãªããããŸãã CUDAã«ç²ŸéããŠããå Žåããå ±æã¡ã¢ãªããšåŒã°ããŸãã äžè¬çãªæ¹æ³ãããã¯ããã«é«éã§ããããã¹ãŠã®ããã»ã¹ãã¢ã¯ã»ã¹ã§ããããã§ã¯ãããŸããã 1ã€ã®ã°ã«ãŒãã®äœæ¥é ç®ã®ã¿ãããŒã«ã«ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã®ã°ã«ãŒãã¯ããã³ã³ãã¥ãŒãã£ã³ã°ãŠãããããŸãã¯ãã¯ãŒã¯ã°ã«ãŒãããšåŒã°ããŸãïŒæåã®ååã¯éã¬ãã«ã®ç©çããŒãã£ã·ã§ã³ãæãã2çªç®ã¯ããã°ã©ã ã¬ãã«ã®è«çããŒãã£ã·ã§ã³ãæããŸãïŒã ããã€ã¹ã«å¿ããŠããããã®åã°ã«ãŒãã«ã¯ç°ãªãæ°ã®äœæ¥é ç®ããããŸãïŒããšãã°ãNVIDIA GT200ã§ã¯240ãRadeon 5700ã·ãªãŒãºã§ã¯256ïŒã ãããã®ãŠãããã®æ°ã¯ããªãå°ãªãæ°ã«å¶éãããŠããŸãïŒNVIDIA GT200ã§ã¯30ãRadeon 5700ã·ãªãŒãºã§ã¯9-10ïŒã ã¯ãŒã¯ã¢ã€ãã ãåç¬ã§ã¢ã¯ã»ã¹ã§ããè¶ é«éã®ããã©ã€ããŒãã¡ã¢ãªãããããŸãã
OpenCLããã€ã¹ãã©ã€ããŒã¯ãã¯ãŒã¯ã¢ã€ãã ãšã¯ãŒã¯ã°ã«ãŒãã®èµ·åãšæäœãèªååããŸãã ããšãã°ã100äžåã®ããã»ã¹ãå®è¡ããå¿ èŠããããèªç±ã«äœ¿ããã¯ãŒã¯ã¢ã€ãã ã1,000åãããªãå Žåããã©ã€ããŒã¯å®äºåŸã«æ¬¡ã®ã¿ã¹ã¯ã§åããã»ã¹ãèªåçã«éå§ããŸãã ç©çã¬ãã«ã®ç解ã¯ãããã»ã¹éã®çžäºäœçšãšã¡ã¢ãªãžã®ããã»ã¹ã®ã¢ã¯ã»ã¹ã®å¯èœæ§ãç解ããããã«ã®ã¿å¿ èŠã§ãã
åºæ¬æ©èœ
ãã®èšèªã¯ã»ãŒæšæºã®C ++ã«åºã¥ããŠãããããOpenCLãšãããåºå¥ããæ©èœã®ã¿ãæ€èšããŸãã ååã®èšäºã§åŒçšããæãåçŽãªã«ãŒãã«ããã°ã©ã ã®ã³ãŒããæ€èšããŠãã ããã ãã®ã³ãŒãã¯ãv1ãšv2ã®2ã€ã®ãã¯ãã«ãè¿œå ããçµæãæåã®ãã¯ãã«ã«å ¥ããŸãã
__kernel void
floatVectorSum(__global float * v1,
__global float * v2)
{
int i = get_global_id(0);
v1[i] = v1[i] + v2[i];
}
* This source code was highlighted with Source Code Highlighter .
æç¶ãã®ãç¥ãã
ãŸããç¥ç§çãªã__kernelããç®ãåŒããŸãã ãã®ãã£ã¬ã¯ãã£ãã¯ãå€éšããåŒã³åºãããã·ãŒãžã£ãããŒã¯ããå¿ èŠããããŸãã å€éšããäœæ¥ãããšãã«æé ãäžèŠãªå Žåã¯ãçç¥ã§ããŸãã
ã¡ã¢ãªã®çš®é¡
ããŒã¿åã__globalãã¯ãå®è¡äžã®ããã€ã¹ã®ã°ããŒãã«ã¢ãã¬ã¹ç©ºéããå²ãåœãŠãããã¡ã¢ãªãæããŸãã ããªãé ãã§ãããããšãããããŸãã ææ°ã®ãããªã«ãŒãã®å Žåãã®ã¬ãã€ãåäœã§æž¬å®ãããŸãã ããã»ããµã§äœæ¥ããå Žåãã°ããŒãã«ã¯RAMãæããŸãã
ã°ããŒãã«ã«å ããŠãã__ localãããããŸãã ã¯ãŒã¯ã°ã«ãŒãã®ã¿ãã¢ã¯ã»ã¹ã§ããŸãã ãã®ãããªã°ã«ãŒãããšã«ãçŽ8ãããã€ããå²ãåœãŠãããŸãã
ãŸããé«éã¡ã¢ãªã¯ã__privatãã§ãã ããã¯ãå¥ã®ã¹ã¬ããïŒã¯ãŒã¯ã¢ã€ãã ïŒã®ã¿ãã¢ã¯ã»ã¹ã§ããã¡ã¢ãªã§ãã åèšã§ããã®ã¡ã¢ãªã®32åã®ã¬ãžã¹ã¿ãã¹ããªãŒã ã«å²ãåœãŠãããŸãã
ã«ãŒãã«ã®äœææã«å®£èšã§ããæ®ãã®ã¿ã€ãã®ã¡ã¢ãªã¯ã__ globalã¿ã€ãã«åºã¥ããŠããŸãã 1ã€ã¯ã__constantãã§ãèªã¿åãå°çšã§äœ¿çšã§ããŸãã 次ã«ããããã¯ã__read_onlyããã__ write_onlyããããã³ã__read_writeãã§ãããããã®æ§é ã®äœ¿çšã¯ç»åã«å¯ŸããŠã®ã¿èš±å¯ãããŠããŸãã
ããã»ã¹èå¥å
ãããªã«ãŒãã§èµ·åããåŸããã¹ãŠã®ããã»ã¹ã¯åçã§ãããåçã®ã³ãŒããå®è¡ããŸãã ããããæããã«ãåãã¢ã¯ã·ã§ã³ãè€æ°åç¹°ãè¿ãå¿ èŠã¯ãããŸãããåããã»ã¹ã¯ã¿ã¹ã¯ã®ç¬èªã®éšåãå®è¡ããå¿ èŠããããŸãã ããããåãå·»ãäžçã§åœŒãã®å Žæãç¹å®ããããšã¯ãããã»ã¹èå¥åã§ãã æãåçŽãªèå¥åã¯ãget_global_idïŒ0ïŒãã§ãã äžèšã®äŸã®å Žåããã®ããã»ã¹ãè¿œå ãããã¯ãã«ã®içªå·ãæããŸãã 1次å ã®ãã¯ãã«ã§ã¯ãªã2次å ã®ç»åãåŠçããå Žåã2ã€ã®è»žã«æ²¿ã£ãããã»ã¹ã®äœçœ®ãç¥ãå¿ èŠããããŸãã ãã¡ããããã®å€ã¯èšç®ã§ããŸãã ãããããããã¯äžå¿ èŠãªæäœã§ãã ãã®ããã䟿å®äžãèµ·åæã«2次å 空éãå¿ èŠã§ããããšãæå®ã§ããŸãã ãã®åŸãããã»ã¹ã§äž¡æ¹ã®äœçœ®èå¥åãååŸã§ããŸãïŒãget_global_idïŒ0ïŒãããget_global_idïŒ1ïŒãã 3次å 空éã§ãåãããšãã§ããŸãã å€ãã®å Žåãäœæ¥ããã¹ããŒã¹ã®å¯žæ³ãå¿ èŠã«ãªãå ŽåããããŸãã ããšãã°ãã»ãšãã©ãã¹ãŠã®åŠçäžã®ç»åã®å Žåãå¹ ãšé«ããå¿ èŠã§ãã ã¹ããŒã¹ã®æ¬¡å ãååŸããã«ã¯ãèå¥åãget_global_sizeïŒiïŒãã䜿çšãããŸãã ããã«ãã¯ãŒãã³ã°ã°ã«ãŒãå ã®ããã»ã¹èå¥å-ãget_local_idïŒiïŒãããget_local_sizeïŒiïŒããããã³ã°ã«ãŒãèªäœã®èå¥å-ãget_group_idïŒiïŒãããget_num_groupsïŒiïŒãããããŸãã ãããã®é¢ä¿ã®ã»ãšãã©ã¯äºãã«é¢é£ããŠããŸãïŒnum_groups * local_size = global_sizeãlocal_id + group_id * local_size = global_idãglobal_sizeïŒ local_size = 0
課éã®æé©å
OpenCLããã³ãããªã«ãŒãã®éçºè ã¯ã圌ãã®çºæ¡ã®äž»ãªç®æšã¯è€éãªèšç®ãå éããããšã§ããããšã«æ°ä»ããŸããã ãããè¡ãããã«ãããã€ãã®ç¹æ®ãªæ©èœãèšèªã«è¿œå ãããŸããããããã®æ©èœã䜿çšãããšãæ°åŠçãªåé¡ãè¿ éã«åŠçã§ããŸãã
ã€ã³ã©ã€ã³ãã¯ãã«
æåã®æ©èœã¯ããã¯ãã«ãšãã¯ãã«æŒç®ã§ãã OpenClã§ã¯ã2ã4ã8ãããã³16次å ã®ãã¯ãã«ãå€æ°ãšããŠå®£èšã§ããŸãã ããã¯ããã«å¿ããŠè¡ãããŸãïŒint2ãint4ãint8ãint16ã ãŸããdoubleãbyteãããã³ä»ã®ãã¹ãŠã®ã¿ã€ãã宣èšã§ããŸãã 察å¿ãã次å ã®ãã¯ãã«ã¯ãå ç®/æžç®/é€ç®/ä¹ç®ããããšãã§ããŸããåæ§ã«ãä»»æã®ãã¯ãã«ãæ°å€ã§é€ç®/ä¹ç®ããããšãã§ããŸãã
uint4 sumall = (uint4)(1,1,1,1);
small += (uint4)(1,1,1,1);
sumall = sumall/2;
* This source code was highlighted with Source Code Highlighter .
ããã«ããã¯ã¿ãŒçšã«æé©åãããå€æ°ã®é¢æ°ããããããããçŽæ¥æäœã§ããŸãã ãã®ãããªé¢æ°ã«ã¯ãè·é¢èšç®é¢æ°ããã¯ãã«ç©é¢æ°ãå«ãŸããŸãã äŸïŒ
float4 dir1 = (float4)(1, 1, 1, 0);
float4 dir2 = (float4)(1, 2, 3, 0);
float4 normal = cross(dir1, dir2);
* This source code was highlighted with Source Code Highlighter .
ãŸãããã¯ãã«ãããŒãžããŠãäžæ¹ããä»æ¹ã«éšåãåãããããããã倧ããªãã®ã«æ¥çããããšãã§ããŸãã
int4 vi0 = (int4) -7 ;
int4 vi1 = (int4) ( 0, 1, 2, 3 ) ;
vi0.lo = vi1.hi; //
int8 v8 = (int8)(vi0.s0123, vi1.s0123); //
* This source code was highlighted with Source Code Highlighter .
ã·ã³ãã«ãªæ©èœ
OpenClã®ãã1ã€ã®æ©èœã¯ãçµã¿èŸŒã¿é¢æ°ã©ã€ãã©ãªã§ãã OpenClã®math.libã®æšæºã»ããã«å ããŠããããããã€ãã£ãé¢æ°ããããŸãã ãããã¯ããããªã«ãŒãã®ç¹å®ã®æ©èœã®äœ¿çšãšå€±ç€Œãªæ°åŠã«çŽæ¥åºã¥ãæ©èœã§ãã ããããè¶ ç²Ÿå¯ãªèšç®ã§äœ¿çšããããšã¯ãå§ãã§ããŸããããç»åãã£ã«ã¿ãªã³ã°ã®å Žåãéãã«æ°ä»ãããšã¯ã§ããŸããã ãã®ãããªé¢æ°ã«ã¯ãããšãã°ããnative_sinãããnative_cosãããnative_powrããå«ãŸããŸãã ãããã®æ©èœã®è©³çŽ°ãªèª¬æã¯è¡ããŸããããå€ãã®æ©èœããããååã¯ç°ãªããŸãã å¿ èŠãªå Žåã¯ãããã¥ã¡ã³ããåç §ããŠãã ããã
äžè¬çãªæ©èœ
ãåçŽãªé¢æ°ãã«å ããŠãéçºè ã¯å€ãã®åŒã°ããå ±éé¢æ°ãäœæããŸããã ãããã¯ãç»ååŠçã§äžè¬çãªæ©èœã§ãã äŸïŒmadïŒaãbãcïŒ= a * b + cãmixïŒaãbãcïŒ= a +ïŒbaïŒ* cã ãããã®é¢æ°ã¯ã察å¿ããæ°åŠã¢ã¯ã·ã§ã³ãããé«éã§ãã
äŸ
ãµã€ãwww.cmsoft.com.brã«ã¯ããã€ãã£ãé¢æ°ãšå ±éé¢æ°ã䜿çšããŠã³ãŒããæé©åããå¯èœæ§ã瀺ãçŽ æŽãããäŸããããŸãã
kernel void regularFuncs()
{
for ( int i=0; i<5000; i++)
{
float a=1, b=2, c=3, d=4;
float e = a*b+c;
e = a*b+c*d;
e = sin(a);
e = cos(b);
e = a*b+c*d;
e = sin(a);
e = cos(b);
e = a*b+c*d;
e = sin(a);
e = cos(b);
float4 vec1 = (float4)(1, 2, 3, 0);
float4 vec2 = (float4)(-1, 3, 1, 0);
float4 vec = distance(vec1, vec2);
double x=1, y=2, z=3;
double resp = x*y+z;
}
}
kernel void nativeFuncs()
{
for ( int i=0; i<5000; i++)
{
float a=1, b=2, c=3, d=4;
float e = mad(a,b,c);
e = mad(a,b,c*d);
e = native_sin(a);
e = native_cos(b);
e = mad(a,b,c*d);
e = native_sin(a);
e = native_cos(b);
e = mad(a,b,c*d);
e = native_sin(a);
e = native_cos(b);
float4 vec1 = (float4)(1, 2, 3, 0);
float4 vec2 = (float4)(-1, 3, 1, 0);
float4 vec = fast_distance(vec1, vec2);
double x=1, y=2, z=3;
double resp = mad(x,y,z);
}
}
* This source code was highlighted with Source Code Highlighter .
2çªç®ã®æé ïŒæé©åã䜿çšïŒã¯35åé«éã§ãã
èš±å¯
OpenClã«ã¯ãããŸããŸãªè¿œå æ©èœãå«ããããšãã§ããå€ãã®ãã£ã¬ã¯ãã£ããããããšã«æ³šæããŠãã ããã ããã«ã¯2ã€ã®çç±ããããŸãã æå-æŽå²çã«ããããã®æ©èœã®ãã¹ãŠããµããŒããããŠããŸããã§ããã 第äºã«ããããã®æ©èœã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã éåžžãæ©èœã¯æ¬¡ã®ã³ãã³ãã«ãã£ãŠæå¹ã«ãªããŸãã
#pragma OPENCL EXTENSION extension name : behavior
* This source code was highlighted with Source Code Highlighter .
äŸãšããŠã 次ã®ã³ãã³ããå«ãŸããŸãïŒãã€ãã¿ã€ããèšç®ã®å粟床ãããã³ãã¹ãŠã®æ°åŠé¢æ°ã䜿çšããæ©èœ
#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
* This source code was highlighted with Source Code Highlighter .
åæãã
éå£
å€ãã®å Žåãã³ã³ãã¥ãŒãã£ã³ã°ã§ã¯ãåæãå¿ èŠã§ãã ããã¯ããã€ãã®æ¹æ³ã§å®çŸãããŸãã æåã¯éå£ã§ãã ããªã¢ã¯ãä»ã®ãã¹ãŠã®ããã»ã¹ãŸãã¯ãã®ã¯ãŒãã³ã°ã°ã«ãŒãã®ããã»ã¹ã«å°éãããŸã§ããã»ã¹ãåæ¢ãããããªããŒã ã§ãã 2ã€ã®äŸã瀺ããŸãã
kernel void localVarExample()
{
int i = get_global_id(0);
__local int x[10];
x[i] = i;
barrier(CLK_LOCAL_MEM_FENCE);
if (i>0) int y = x[i-1];
}
kernel void globalVarExample()
{
int i = get_global_id(0);
__global int x[10];
x[i] = i;
barrier(CLK_GLOBAL_MEM_FENCE);
if (i>0) int y = x[i-1];
}
* This source code was highlighted with Source Code Highlighter .
æåã®äŸã§ã¯ãããªã¢ã³ãã³ãã§ã¯ãŒã¯ã°ã«ãŒãã®ãã¹ãŠã®ããã»ã¹ãäºæ³ããã2çªç®ã§ã¯ãOpenCLããã€ã¹ã®ãã¹ãŠã®ããã»ã¹ãäºæ³ãããŸãã
ãã®äŸã®ç¹åŸŽã§ããã³ãã³ãã__local int x [10];ãã«æ³šç®ãã䟡å€ããããŸãã ããã³ã__global int x [10];ãã ãããã䜿çšãããšãããã»ã¹ã®ã°ã«ãŒãããã³å®è¡äžã®ãã¹ãŠã®ããã»ã¹ã§ã°ããŒãã«å€æ°ãéžæã§ããŸãã
åäžã®æäœ
ã¹ã¬ããéã§åæããããã®2çªç®ã®ãªãã·ã§ã³ã¯ã¢ãããã¯ã§ãã ãããã¯ãã¡ã¢ãªãžã®åæã¢ã¯ã»ã¹ãé²ãæ©èœã§ãã ãããã䜿çšããåã«ã次ã®ãã£ã¬ã¯ãã£ããå«ããå¿ èŠããããŸãã
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable
* This source code was highlighted with Source Code Highlighter .
ãã®é¢æ°ã®æãç°¡åãªäŸïŒ
__kernel void test(global int * num)
{
atom_inc(&num[0]);
}
* This source code was highlighted with Source Code Highlighter .
ãatom_incïŒïŒnum [0]ïŒ;ãã®ä»£ããã«num ++ãæžã蟌ãŸããå Žåããã¹ãŠã®ããã»ã¹ãåæã«ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããŠåãå€ãèªã¿åããããããã°ã©ã å®è¡ã®çµæã¯äºæž¬äžèœã§ããã åèšã§ã11ã®ãŠãããæäœé¢æ°ããããŸãïŒãaddãsubãxchgãincãdecãcmp_xchgãminãmaxãããã³ãorãxorãã
ãããã®é¢æ°ã䜿çšããŠã»ããã©ãäœæããããšã¯é£ãããããŸããã
void GetSemaphor(__global int * semaphor) {
int occupied = atom_xchg(semaphor, 1);
while (occupied > 0)
{
occupied = atom_xchg(semaphor, 1);
}
}
void ReleaseSemaphor(__global int * semaphor)
{
int prevVal = atom_xchg(semaphor, 0);
}
* This source code was highlighted with Source Code Highlighter .
ç»åãæäœãã
ãã®ã¬ã€ãã«æåŸã«å«ãããã®ã¯ãOpenCLãä»ããŠç»åãæäœããããšã§ãã ã¯ãªãšãŒã¿ãŒã¯ããŠãŒã¶ãŒã®è³ãæå°éã«æããå¿ èŠãããç»åã䜿çšããŠäœåãäœæããããšããŸããã ãšãŠãããã§ãã ã¿ã€ãimage2d_tããã³image3d_tã®ç»åã®ããŠã³ããŒããå¯èœã§ãã åè ã¯æ®éã®ç»åã§ãåŸè ã¯äžæ¬¡å ã§ãã ãŸããããŒããããã€ã¡ãŒãžã¯ãã__ read_onlyããã__ write_onlyããã__ read_writeãã®ããããã®åœ¢åŒã§ããå¿ èŠããããŸãã ã€ã¡ãŒãžããã®ããŒã¿ã®èªã¿åããšæžã蟌ã¿ã¯ãç¹å¥ãªæé ã«ãã£ãŠã®ã¿å¯èœã§ãïŒvalue = read_imageuiïŒã€ã¡ãŒãžããµã³ãã©ãŒãäœçœ®ïŒãwrite_imageuiïŒã€ã¡ãŒãžãäœçœ®ãå€ïŒã
ç§ã®æèŠã§ã¯ãããµã³ãã©ãŒãã®æŠå¿µãé€ããŠãããã®ãã¹ãŠãæ確ã§ãã ãµã³ãã©ãŒã¯ãç»åã§ã®äœæ¥ãæé©åãããã®ã§ãã ãæ£èŠåããã座æšãããã¢ãã¬ã¹ã¢ãŒãããããã£ã«ã¿ãŒã¢ãŒããã®3ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãã æåã®2ã€ã®æå³ããããŸãïŒãCLK_NORMALIZED_COORDS_TRUEãCLK_NORMALIZED_COORDS_FALSEãã ååã«å¿ããŠãå ¥å座æšãæ£èŠåãããŠãããã©ããã瀺ãå¿ èŠããããŸãã 2çªç®ã¯ãç»åã®å¢çã®å€åŽãã座æšãèªã¿åãããšããŠããå Žåã®å¯ŸåŠæ¹æ³ã瀺ããŠããŸãã å¯èœãªãªãã·ã§ã³ïŒã€ã¡ãŒãžïŒCLK_ADDRESS_MIRRORED_REPEATïŒããã©ãŒãªã³ã°ããã«ã¯ãæãè¿ãå¢çå€ïŒCLK_ADDRESS_CLAMP_TO_EDGEïŒãåããããŒã¹ã«ã©ãŒïŒCLK_ADDRESS_CLAMPïŒãåããäœãããªãïŒãŠãŒã¶ãŒã¯ãããCLK_ADDRESS_NONEãèµ·ãããªãããšãä¿èšŒããŸãïŒã 3çªç®ã¯ãå ¥åã«æŽæ°åº§æšããªãå Žåã®åŠçââã瀺ããŠããŸãã å¯èœãªãªãã·ã§ã³ïŒæãè¿ãå€ã«è¿äŒŒïŒCLK_FILTER_NEARESTïŒãç·åœ¢è£éïŒCLK_FILTER_LINEARïŒã
ç°¡åãªäŸã ãšãªã¢å ã®å¹³åå€ã§ç»åãåžåããŸãã
__kernel void ImageDiff(__read_only image2d_t bmp1, __write_only image2d_t bmpOut)
{
const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE |
CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_NEAREST;
int2 coords = (int2)(get_global_id(0), get_global_id(1));
uint4 sumall = (uint4)(0,0,0,0);
int sum = 0;
for ( int i=-10;i<11;i++)
for ( int j=-10;j<11;j++)
{
int2 newpol = (int2)(i,j)+coords;
sumall+= read_imageui(bmp1, smp, newpol);
sum++;
}
sumall = sumall/sum;
write_imageui(bmpOut, coords, sumall);
}
* This source code was highlighted with Source Code Highlighter .
æçšæ§
ãŸããç§ã¯ç°¡åãªèª¬æã管çãããšæããŸãã 誰ãããããå¿ èŠãšãããªãã°ãä»ããã詳现ãªç 究ã®ããã®ããã€ãã®ãªã³ã¯ã
ããã¥ã¡ã³ããå«ãå ¬åŒãµã€ãã
äŸãšæ確ãªèª¬æããããµã€ãã
è¯ãpdfnichekãããã«ã¯OpenClããã€ã¹ã®æ§é ãããæãããŠããŸãã
ãã·ã¢èªã®OpenCLã«é¢ãã2ã€ã®ãã¬ãŒã³ããŒã·ã§ã³ããããŸãã ãããã«ã¯ããªãã®æ å ±ããããé¢é£ããããã¹ãã¯ãããŸããã 確ãã«ãè¯ãäŸããããŸãã æåã®ãã® ã äºçªç® ã