æžããããšãã
| float4 val = (0, 0, 0, 0);
|
èè
ãæžãããã£ãããš
| float4 val = (float4)(0, 0, 0, 0);
|
æžãæ¹
| float4 val = 0;
|
OpenCLã«åºããããããå®è¡ããäºå®ã§ãæåãš2çªç®ã®ãªãã·ã§ã³ã®éããããããªãå Žåã3çªç®ã®ãªãã·ã§ã³ã§ãã³ã³ãã€ã«ã§ããŸããïŒã-catãæè¿ããŸããèšèªã®ãã¥ã¢ã³ã¹ã¯ãããããããAPIãšããã©ãŒãã³ã¹ã®æé©åã«ã€ããŠã¯ãŸã£ãããããŸããã
æãé«äŸ¡ãªã³ã³ãã¥ãŒã¿ãŒã¡ã¢ãªã¯ããã°ã©ãã®é ã®äžã«ãããŸãã ãããããããã2ã€ã®æã人æ°ã®ããGPUããã°ã©ãã³ã°ãã¯ãããžãŒã§ããCUDAãšOpenCLããç¹å®ã®ã¢ãŒããã¯ãã£çšã®ã¢ã»ã³ãã©ãŒã§ã¯ãªããæ ¹æ¬çã«æ°ãã䞊åèšèªã«åºã¥ããŠããã®ã§ã¯ãªããé©å¿C ++ãšCã«åºã¥ããŠããçç±ã§ã.OpenCLã®å Žåãæãäžè¬çãªã«ãŒãã«èšè¿°èšèªã¯OpenCL C 1.2ã§ã- ISO C99ã«åºã¥ãCæ¹èšã æšæºã©ã€ãã©ãªãåé€ããããããã«å¯Ÿãããã¯ãã«åãšæäœã远å ãããŸãããä»ã®ãããŒéã§ã®äœçœ®ãããã¯ããã³æ±ºå®ããããã®ããã€ãã®é¢æ°ã4ã€ã®ã¢ãã¬ã¹ç©ºéã C11ãšäºææ§ã®ãªãåçŽãªã¢ãããã¯æäœã远å ãããŸããïŒC11ããã®ã¢ãããã¯æäœãšããã¯ã¯ããŸã æ®åããŠããªãOpenCL C 2.0ã«è¿œå ãããŸããïŒã æšæºåããã
çµã¿èŸŒã¿é¢æ°ã®ãããªãCã«ã¯ãªã䟿å©ãªé¢æ°ãããã€ã远å ããŸããã
èšèªãšAPIã«é¢ããå€ãã®äŸããããŸããããã®ã»ãšãã©ã¯2ã€ã®ãã¯ãã«ã®è¿œå ã§ãã 也ç¥ããŠãããšã¯ãããåªãã
å
¬åŒä»æ§ ãããã€ãã®è±èªã®æžç±ãããã³ããã€ã¹ã¡ãŒã«ãŒããã®æé©åã®ãã³ãããããŸãã ããã°ã©ããŒã¯èªåã®ã¿ã¹ã¯ã®æžãæ¹ãçè§£ãããšããã«ã
get_global_id()
ãããªæ°ãã颿°ã䜿çšããŠäœ¿ãæ
£ããC99ã«æžã蟌ã¿ãèšèªã«é¢ãããã¹ãŠãæç¢ºã§åå§çãªããã«èŠããŸãã ãã®ãããªéŠŽæã¿ã®ããC99ã§ãç°¡åã«ãã©ããã«é¥ããåœé¢ã¯æ°ä»ããªãããšããããŸãã ã¯ããOpenCL Cã¯Cã«éåžžã«äŒŒãŠããŸãããC99ã«ã¯é¡äŒŒç©ããªãããå¿ããããªãã»ã©å¿ããã¡ãªéåžžã«æçšãªéãããããŸãã
ç§ã¯å€ãã®OpenCL Cã³ãŒããèŠãŸããããæžãå§ããã°ããã®äººãåãééããç¯ããŸãã
- ãã¯ãã«ãªãã©ã«ãšåãã£ã¹ããæ··åããŸãã
- ãã°ãããå倿ã¡ã«ããºã ã䜿çšããªãã§ãã ãã
- ãã¯ãã«åã®å€æã®åŸ®åŠãªéããå¿ããŠãã ããã
ãªã¹ããããããããã«ãããã¯ãã¹ãŠå倿ã«é¢ãããã®ã§ãã
OpenCL 1.2仿§ã§ã¯ããããã¯ã»ã¯ã·ã§ã³
6.2ã* Conversions and Type Castingã§ãã ããã«ã次ã®ã»ã¯ã·ã§ã³
6.3æŒç®å㯠cã§ã
誰ãèªã¿ãŸãã ã çµéšã瀺ãããã«ã仿§ã®å€ãã¯æç¢ºã«èšè¿°ãããŠããããããŸãã«ãéå±ã§ãããããã®ãããã¯ã«é¢ããã¢ã¯ã»ã¹å¯èœãªãã·ã¢èªã®ããã¥ã¡ã³ãã®ã®ã£ããããã®èšäºã§åããããšããŸãã
ãã¯ãã«ãªãã©ã«ãŸãã¯æç€ºçãªãã£ã¹ã
OpenCL Cã®æ°ãããã¶ã€ã³ã¯ããã¯ã¿ãŒã®å€ãèšå®ã§ãããã¯ã¿ãŒãªãã©ã«ã§ãã æ®å¿µãªããããã®æ§æã¯æç€ºçãªåãã£ã¹ãã«éåžžã«äŒŒãŠããŸãã
( )( )
äŸãã°
(int2)(1,2);
ãŸãã¯
ãã ãã
(float2)(1)
ããã³äžèšã®ä»ã®äŸã¯åãã£ã¹ãã§ã¯ãªããæ°ãããã¶ã€ã³ã§ãïŒ
OpenCL 1.2仿§ã® 6.1.6 Vector Literalsãåç
§ïŒã
2çªç®ã®æ¬åŒ§å
ã«ã¯ãæåã®æ¬åŒ§å
ã®ãã¯ãã«åãšåãæ°ã®ãã¯ãã«ã®ã¹ã«ã©ãŒãŸãã¯ã³ã³ããŒãã³ãã®åèšãããã¯ãã§ãã äŸå€ã1ã€ãããŸã-å³åŽã«æ¬åŒ§ã§å²ãŸããã¹ã«ã©ãŒå€ã1ã€ãããªãå Žåãããèªäœãå¿
èŠãªæ°ã®ãã¯ãã«ã³ã³ããŒãã³ãã«ãä¹ç®ããããŸãã
Cã¹ã¿ã€ã«ã§ã®ãã¯ãã«åã®æç€ºçãªãã£ã¹ãã¯ãåã«èšèªã§ã¯ãããŸããã ãã¯ãã«ãªãã©ã«ã§ã¯ãªãããç®ãéãããç¶æ
ã§ããªãã¿ã®ãããå倿ãèŠããšãèŽåœçãªééããç¯ãå¯èœæ§ããããŸãã æ¬¡ã«ãå
é ã®æ¬åŒ§å
ã®åãåé€ã§ããŸãããçµå±ãæ¢ã«ã³ã³ãã€ã«ãããŠããŸãããªãäžèŠãªå倿ãªã®ã§ããããïŒ ãã§ã«æé»çã«å°ãããŠããŸããã
å®éã®äŸïŒ
int2 coords = (get_global_id(0), get_global_id(1));
coords
ã¯ãã¯ãã«ãªãã©ã«ã«ãã£ãŠèšå®ãããŸããããã¯ãã«ãªãã©ã«ã®å Žåã¯ããã¯ãã«ã¿ã€ãã远å ããå¿
èŠããããŸããã
int2 coords = (int2)(get_global_id(0), get_global_id(1));
ããããæ¬¡ã®ããã«ãªããŸããïŒ
(get_global_id(0), get_global_id(1))
ãããŠããã¯éåžžã®Cããã®æ§ç¯ã§ã-æ¬åŒ§å
ã§ãæŒç®åããïŒã³ã³ãïŒã䜿çšããŠ2ã€ã®é¢æ°ãåŒã³åºããŸããã€ãŸããäž¡æ¹ã®é¢æ°ãå®è¡ãããåŒãçµæãè¿ããŸã2çªç®ã®é¢æ°ãç§ãã¡ãæžãããã®ããã«ïŒ
get_global_id(0); int2 coords = get_global_id(1);
ã¹ã«ã©ãŒã®ãã¯ãã«ãžã®æé»çãªå€æïŒããã«å°ãïŒãæ©èœã
[get_global_id(1), get_global_id(1)]
[get_global_id(0), get_global_id(1)]
ã§ã¯ãªãããã¯ãã«
[get_global_id(1), get_global_id(1)]
ããããŸãã
幞ããªããšã«ãåçŽãªã±ãŒã¹ã§ã¯ãã³ã³ãã€ã©ã¯ã
warning: expression result unused
ããªã©ã®èŠåãçºè¡ããå ŽåããããŸãããããã«é Œãã¹ãã§ã¯ãããŸããã
ãã®ãããªã³ãŒãã¯ãæ£ããæ©èœããªããããããã«èŠã€ããããšãã§ããŸãã ãã ããæ¬¡ã®äŸã¯ãè²ãç°è²ã§ããéãæ©èœããŸãã è²ã倿Žããããšãã¯ãäœããã®çç±ã§ããŸã ç°è²ã«ãªããŸãã
ã³ãŒãã¯æ©èœããŠããããããžã§ã¯ããéä¿¡ãããŸããã ãããŠãçªç¶ãå°ããªå€æŽãå¿
èŠã«ãªããŸãã-ã°ã¬ãŒã®è²ãæ¿çŽºã«ããããã§ãã
ãã¯ãã«ãªãã©ã«ã䜿çšããå¿
èŠããããŸããã
ããŒã«å€ãããã¯ãã«ãžã®å€æ
int val = true; int2 val2 = true;
val
ã®æå³ã¯äœã§ããïŒ
val2
ã¯ã©ãããããŸããïŒ
ã¹ã«ã©ãŒã®å Žåã
bool
å€ã倿ãããšãã«ISO C99ã«ãŒã«ãé©çšããïŒ
bool
åãšå®æ°
true
ããã³
false
ã¯C99ããã³OpenCL Cã«ãããŸãïŒã
false
ã¯ãŒãã«ãªãã
true
ã¯1ã«ãªããŸãã ãããã¯ã¹ã«ã©ãŒã®ã«ãŒã«ã§ãã ãããã£ãŠã
val
ã¯ã1ãã«ãªããŸãã ããã¯å¿
ããã䟿å©ã§ã¯ãããŸãããããã®ãããªåäœã¯ããã°ã©ãã®è³ã«çµã¿èŸŒãŸããŠããŸã
x+=(a>b)
ãããªæ§é
x+=(a>b)
ãã¯ãé©ãã¹ãããšã§
x+=(a>b)
ãŸããã
ãã ããOpenCL Cã§ã¯ããã¯ãã«æŽæ°åã«å€æããå Žåã
bool
åã®å€ã¯ããã¹ãŠã®ãããããŒãã§ãããããã¹ãŠã®ãããã1ã§ããæŽæ°ãè¿ããŸããããã¯
(int)-1
察å¿ããŸãã ãã®ãããã¯ã«é¢ãã
仿§ã®å
å®¹ã¯æ¬¡ã®ãšããã§ãïŒã»ã¯ã·ã§ã³
6.2.2æç€ºçãªãã£ã¹ã ïŒã
boolããã¯ãã«æŽæ°ããŒã¿åã«ãã£ã¹ããããšãboolå€ãtrueã®å Žåããã¯ãã«ã³ã³ããŒãã³ãã¯-1ïŒã€ãŸãããã¹ãŠã®ããããèšå®ãããŸãïŒã«èšå®ãããããã§ãªãå Žåã¯0ã«èšå®ãããŸãã
ãããã£ãŠã
val2
ã¯ãã¯ãã«
[-1, -1]
ãŸãã ããã¯ãåŒãæåã«ãã¯ãã«ã³ã³ããŒãã³ãã®åã«å€æãããæ¬¡ã«ä¹ç®ãããå倿ã®ã³ã³ããã¹ãã§ã¯å°ãäºæ³å€ã§ã-ä»ã®åãšåæ§ã«ããã®åäœã¯
bool
ã«å¯ŸããŠå®£èšãããŸãã é©åã«äœ¿çšããã°ãæ¡ä»¶åŒããããããšã®æŒç®ã«çœ®ãæããããšãã§ããŸãã
ãã³ã³ãã€ã«ãããã©ããïŒ å€æ°ã®å€ã¯äœã§ããïŒããšæžããŠã
opencl-sandboxãããžã§ã¯ãã
githubã«ã¢ããããŒãã
ãŸãã ã ç§ã®ãã·ã³ã§ãã®èšäºã®ãã¹ãŠã®äŸããã§ãã¯ããŸããã
ãããå«ãïŒ
__kernel void bool_to_int_vec() { int val = true; int2 val2 = true; printf("int val = true; // val=%d\n", val); printf("int2 val2 = true; // val2=%v2d\n", val2); if(val2.x == -1 && val2.y == -1) { printf("Compiler follows specification for bool->intn conversion, OK\n"); } else { printf("Compiler does not follow specification for bool->intn conversion, FAILED\n"); } }
ãåç¥ã®ããã«ãã³ã³ãã€ã©éçºè
ã人éã§ããã仿§ãæèšããŠããŸããã
ç§ã®ãã·ã³ã§ã¯ã2ã€ã®ãã©ãããã©ãŒã ã§ã®å®éšã®çµæãããããã§2ã€ã®ããã€ã¹ãç£èŠããŸããã$ ./clrun ../kernels/bool_to_int_vec.cl
...
Running "bool_to_int_vec" kernel on AMD Accelerated Parallel Processing / Tonga
int val = true; // val=1
int2 val2 = true; // val2=-1,-1
Compiler follows specification for bool->intn conversion, OK
...
Running "bool_to_int_vec" kernel on AMD Accelerated Parallel Processing / Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz
int val = true; // val=1
int2 val2 = true; // val2=1,1
Compiler does not follow specification for bool->intn conversion, FAILED
...
Running "bool_to_int_vec" kernel on Intel(R) OpenCL / Intel(R) HD Graphics
int val = true; // val=1
int2 val2 = true; // val2=1,1
Compiler does not follow specification for bool->intn conversion, FAILED
...
Running "bool_to_int_vec" kernel on Intel(R) OpenCL / Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz
int val = true; // val=1
int2 val2 = true; // val2=1,1
Compiler does not follow specification for bool->intn conversion, FAILED
2ã€ã®OpenCLãã©ãããã©ãŒã -AMDããã³Intelã åãã©ãããã©ãŒã ã«ã¯ãGPUãšCPUã®2ã€ã®ããã€ã¹ããããŸãã ãããŠãGPUçšã®AMDã³ã³ãã€ã©ïŒæãæçããïŒã®ã¿ã仿§ã«åŸã£ãŠãããä»ã®3ã€ã¯-1ã§ã¯ãªã
val2
ã«ãŠãããã®ãã¯ãã«ãèšè¿°ããŠããŸãã
ãã°ããããŠãAMDãIntelãããã³NVidiaã®3ã€ã®OpenCLå®è£
ãåããå¥ã®ãã·ã³ã§åãã«ãŒãã«ããã§ãã¯ããŸããã...
Running "bool_to_int_vec" kernel on AMD Accelerated Parallel Processing / Ellesmere
int val = true; // val=1
int2 val2 = true; // val2= -1,-1
Compiler follows specification for bool->intn conversion, OK
...
Running "bool_to_int_vec" kernel on AMD Accelerated Parallel Processing / Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
int val = true; // val=1
int2 val2 = true; // val2= 1,1
Compiler does not follow specification for bool->intn conversion, FAILED
...
Running "bool_to_int_vec" kernel on Intel(R) OpenCL / Intel(R) HD Graphics 630
int val = true; // val=1
int2 val2 = true; // val2= -1,-1
Compiler follows specification for bool->intn conversion, OK
...
Running "bool_to_int_vec" kernel on Intel(R) OpenCL / Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
int val = true; // val=1
int2 val2 = true; // val2= -1,-1
Compiler follows specification for bool->intn conversion, OK
...
Running "bool_to_int_vec" kernel on NVIDIA CUDA / GeForce GTX 1060 6GB
int val = true; // val=1
1,1
Compiler does not follow specification for bool->intn conversion, FAILED
ã·ã¹ãã ã«ã¯5ã€ã®ããã€ã¹ããããŸãã AMDã³ã³ãã€ã©ãåãããã«åäœããŸãã Intelã®ææ°ã®ã³ã³ãã€ã©ã¯ãä¿®æ£ããããçŸåšã¯æšæºã«åŸã£ãŠåäœããŸãã NVidiaã³ã³ãã€ã©ã¯ããã¯ãã«åã«å€æããã ãã§ãªãã2çªç®ã®
printf()
è¡ã衚瀺ããããšãã§ããŸããã§ããã
ããã«ã¯2ã€ã®çµè«ããããŸãã
- 仿§ã®ç¥èããªããã°ãç§»æ€å¯èœãªã³ãŒããæžãããšã¯ã§ããŸããã
- åãã©ãããã©ãŒã ã¯ç¬èªã®æ¹æ³ã§ä»æ§ãçè§£ãããããOpenCLã«ãŒãã«ããã¹ãã§ã«ããŒããå¿
èŠããããŸãã
ãã¯ãã«ã®è«çæŒç®åãšæ¯èŒæŒç®å
bool
ã
int
ã«ãã£ã¹ãããå Žåã察å¿ããæŒç®åã¯ã¹ã«ã©ãŒãšãã¯ãã«ã«å¯ŸããŠç°ãªãåäœãããŸãã æŒç®åã®å®è¡çµæã®å€
>
ã
<
ã
>=
ã
<=
ã
==
!=
ã
&&
ã
||
!
ãããã¯
int
ã§ãã ã¹ã«ã©ãŒã®å Žå-0ãŸãã¯1ããã¯ãã«ã®å Žå-å€0ãŸãã¯-1ãæã€
int
ã®å¯Ÿå¿ããé·ãã®ãã¯ãã«ïŒãã¹ãŠã®ãããã1ã«èšå®ãããŸãïŒã
int a = 1 > 0;
4ã€ã®ã³ã³ãã€ã©ããã§ãã¯ãããšãä»åã¯ãã¹ãŠãæ£ããçµæãåºããŸããã
ãã¯ãã«ã®äžé
æŒç®å
ã
exp1 ? expr2 : expr3
ããšãã圢åŒã®äžé
æŒç®å
exp1 ? expr2 : expr3
ãã¯ãã¹ã«ã©ãŒãšãã¯ãã«ã«å¯ŸããŠãåæ§ã«ç°ãªãåäœãã
exp1 ? expr2 : expr3
ã C99ã®ãããªã¹ã«ã©ãŒã®å Žåã
expr1
ãŒãã§ãªãå ŽåãåŒã®çµæã¯
expr2
ã
expr1
ãŒãã®å Žåã
exp3
expr1
ãŸãã
ãã¯ãã«ã®å Žåãæåã«ã
expr1
åã¯æŽæ°ã®ã¿ã«ãªããŸãã 第äºã«ã
expr1
æ¡ä»¶ããã§ãã¯ãããšã
expr1
ãã§ãã¯ã¯ãŒããšçãããªããããæåã®ãããã§ãªãã
æäžäœãããã®ãã
ã§ã ã åæã«ãæŒç®åã¯ã³ã³ããŒãã³ãããšã«æ©èœããŸãã åŒ
expr2
ãš
expr3
ããã¯ãã«ã§ãããäžæ¹ãã¹ã«ã©ãŒã§ããå Žåãã¹ã«ã©ãŒã¯å¯Ÿå¿ããã³ã³ããŒãã³ãã䜿çšããŠæé»çã«ãã¯ãã«åã«å€æãããŸãã
int a = 1 ? 1 : 0;
ã芧ã®ãšãããããã§åã³é¡äŒŒæ§ã®trapã«é¥ãããšããããŸãã åãã³ãŒããæ£ç¢ºã«ãã¯ãã«åãšæ¯èŒããŸãã
int a = 1 ? 1 : 0;
ãã¯ãã«
b
ã仿§ãšCããã°ã©ããŒã®æžæãã«å®å
šã«äžèŽããŠããŒãã§æºããããŠããŸãã
宿°åãšæŽæ°åãOpenCL Cã«å€æãã
ã¹ã«ã©ãŒåã®å ŽåãæŽæ°åãã宿°åã宿°åããæŽæ°åãžã®å€æã¯ãC99ãšåãèŠåã«åŸã£ãŠå®è¡ãããŸããã€ãŸãã宿°åããæŽæ°åãžã®å€æã§ã¯å°æ°éšã¯æåŠãããŸããå
ã®æŽæ°ãšåãå€ã 倿ãè¡ãããåã®ç¯å²ã«æ°å€ãåãŸããªãå Žåãçµæã¯å®è£
ã«ãã£ãŠç°ãªããŸãã
ããã¿ã€ãã®ããŒã¿ãå¥ã®ã¿ã€ãã®ããŒã¿ãšããŠè§£éããå¿
èŠãããå ŽåãC99ã§ãããè¡ãå¯äžã®æ¹æ³ã¯ã
memcpy
颿°ã䜿çšããããšã ãã§ãã OpenCLã«ã¯
memcpy
ããããŸããããC99ãšã¯ç°ãªãããŠããªã³ã䜿çšããŠããŒã¿ãç°ãªãã¿ã€ãã®ããŒã¿ãšããŠè§£éããããšã¯å®å
šã«åæ³ã§ãã
OpenCLèšèªã¯ããŠããªã³ãæ¡åŒµããŠãããã°ã©ã ãç°ãªãã¿ã€ãã®ã¡ã³ããŒã䜿çšããŠãŠããªã³ãªããžã§ã¯ãã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
ããã«ãé£œåæŒç®çšã®ãã¯ãã«åãšããŒããŠã§ã¢æ©èœããµããŒããããŠããŸã-ããã«ãããOpenCLã§ã®åå€æã®æ©èœã決ãŸããŸãã
次ã®ã¿ã€ãã®ã¿ã€ã倿ããµããŒããããŠããŸãã
- æé»çãªå€æ
- æç€ºçãªãã£ã¹ã
- æç€ºçãªå€æ
- ããŒã¿ãå¥ã®ã¿ã€ãã®ããŒã¿ãšããŠè§£éããïŒããŒã¿ãå¥ã®ã¿ã€ããšããŠåè§£éããïŒã
OpenCLã§ã¯ãã¢ã€ãã 1ãš2ã¯C99ã«äŒŒãŠãããã¢ã€ãã 3ãš4ã¯ããã¯ã¿ãŒã¿ã€ãã§ã®äœæ¥ã®å©äŸ¿æ§ãšæç¢ºãã®ããã®é©æ°ã§ãã
æé»çãªå€æãšæç€ºçãªCã¹ã¿ã€ã«ã®ãã£ã¹ã
C99ã®ããã«ãããŸããŸãªã¿ã€ãã®ãªãã©ã³ããåŒã§èŠã€ãã£ãå Žåããããã¯1ã€ã®å
±éã¿ã€ãã«å€æãããŸãã éãã¯ãããããã¯ãã«ã«å¯ŸããŠã©ã®ããã«æ©èœãããã§ãã ã¹ã«ã©ãŒåã®å ŽåãC99ãšåãæ¹æ³ã§æé»çãªåå€æãšæç€ºçãªå倿ããµããŒããããŸãã
float a = 5.1f; int b = a;
æç€ºçãŸãã¯æé»çã«ã¹ã«ã©ãŒåãããã¯ãã«åã«å€æããå Žåãã¹ã«ã©ãŒã¯æåã«C99ãšåæ§ã®èŠåã«åŸã£ãŠãã¯ãã«èŠçŽ ã®åã«å€æãããæ¬¡ã«ä¹ç®ãããŸã
ãã¯ã¿ãŒã¿ã€ãã®ãµã€ãºïŒ
float a = 4.7f; float4 b = 5;
ãããã¯ãã«åããå¥ã®ãã¯ãã«åãžã®æé»çãªå€æããã³æç€ºçãªCã¹ã¿ã€ã«ã®ãã£ã¹ãã¯çŠæ¢ãããŠããŸãã åãæ°ã®ã³ã³ããŒãã³ããããå Žåã§ãã
float4 a = (float4)(5.0f, 5.0f, 5.0f, 5.0f);
ãã¯ãã«åã®æç€ºçãªãã£ã¹ãã¯ãããŸããããã¹ã«ã©ãŒããã¯ãã«åã«ãã£ã¹ãã§ããŸãã ããã«ããããã¯ãã«ãªãã©ã«ãããã«æ··ä¹±ããŸãã åãã³ã³ããŒãã³ããæã€ãã¯ãã«ãæå®ãã3ã€ã®æ¹æ³ãæ¯èŒããŸãã
float2 a = (float2)(1);
ã³ã³ããŒãã³ããç°ãªããã¯ã¿ãŒã®å Žåãåãã³ãŒãã¯æ©èœããŸããããã¯ã¿ãŒãªãã©ã«ã䜿çšããã ãã§ãã ææªãªã®ã¯ã以äžã®ãã¹ãŠã®ã³ãŒããæ£åžžã«ã³ã³ãã€ã«ãããããšã§ããçµæã ããé©åã§ãã
float2 a, b, c, d;
宿°åãšæŽæ°åã®æç€ºçãªå€æ
Cã¹ã¿ã€ã«ã®ãã£ã¹ãã«å ããŠãOpenCLã«ã¯ããªãŒããŒãããŒç¶æ
ãåŠçãããã¯ãã«ãåŠçããåãã£ã¹ãã¡ã«ããºã ããããŸãã ããã¯äžé£ã®æ©èœã§ãã
convert_()
ããäžè¬çãªæ©èœ
convert_<_sat><_>()
ããã«ããªãŒããŒãããŒã¢ãŒããšäžžãã¢ãŒãã䜿çšããŸãã ã¹ã«ã©ãŒãšãã¯ãã«ã®å Žåã颿°ã¯åãããã«æ©èœããŸãã ãœãŒã¹ã®ãã¯ãã«ã®èŠçŽ æ°ãšçµæã®åã¯äžèŽããå¿
èŠããããŸãã
float a = 5.5f; int b = convert_int(a);
æŽæ°åã«ãã£ã¹ãããå ŽåããªãŒããŒãããŒã®åäœã¯ãªãã·ã§ã³ã§æ±ºå®ãããŸã
修食å
_sat
ã ããããªããšãC99ã§éåžžã©ããæŽæ°åã®ãªãŒããŒãããŒãçºçãã飜åãæ©èœãããããåã§èš±å¯ãããç¯å²å€ã®å€ã¯ã倿åŸã®åã§è¡šçŸã§ããæãè¿ãå€ã«åæžãããŸãã
int a = 257; uchar b = convert_uchar(a);
å®éã®åã«ãã£ã¹ãããå Žåã
_sat
èš±å¯ãããŸããã ããã¯å¿
èŠãããŸãããå®éã®åããªãŒããŒãããŒãããšããããã¯ãã§ã«Â±INFã«ãªãããã§ãã
äžžããå¶åŸ¡ããã«ã¯ã修食å
_rte
ïŒæãè¿ãå¶æ°ã«
_rtz
ïŒã
_rtz
ïŒãŒãã«
_rtp
ïŒã
_rtp
ïŒæ£ã®ç¡é倧ã«
_rtn
ïŒãããã³
_rtn
ïŒè² ã®ç¡é倧ã«äžžããïŒã䜿çšãããæãè¿ãæŽæ°ãžã®äžžãããŒããžã®äžžããäžžãããã©ã¹ç¡é倧ããã³ãã€ãã¹ç¡é倧ãžã®äžžãã äžžã修食åããªãå Žåã¯ã
_rtz
䜿çšããŠå®æ°ããæŽæ°ã«å€æããæŽæ°ãã宿°ã«å€æãããšãã«
_rtz
䜿çšããŸãã
_rte
ã¯ãéåžžã®æ°åŠã§ã¯ãªããæãè¿ãæŽæ°ãžã®äžžãã®ããããã
ãã³ãã³ã° ãããŒãžã§ã³ã䜿çšããŸãã å°æ°éšãæ£ç¢ºã«0.5ã§ããå Žåãæãè¿ãæŽæ°ã¯1ã€ã§ã¯ãªãã2ã€ã®æãè¿ãæŽæ°ããå¶æ°ãéžæãããŸãã
int a = convert_int_rtp(4.2f);
ããŸããŸãªäžžãã¢ãŒãã§
float
ã
int
倿ããŸãïŒ
ããã§ãã§ãã¯ã
ãŸã ïŒïŒ
| 0.5
| -0.5
| 1.1
| -1.1
| 1.5
| -1.5
| 1.7
| -1.7
|
æãè¿ãæŽæ°ãžã®äžžã ïŒæãè¿ãå¶æ°ã«äžžããrteïŒ
| 0
| 0
| 1
| -1
| 2
| -2
| 2
| -2
|
ãŒããžã®äžžã ïŒãŒãã«åãã£ãŠäžžããrtzïŒ
| 0
| 0
| 1
| -1
| 1
| -1
| 1
| -1
|
æ£ã®ç¡é倧ãžã®äžžã ïŒæ£ã®ç¡é倧ã«åãã£ãŠäžžããrtpïŒ
| 1
| 0
| 2
| -1
| 2
| -1
| 2
| -1
|
è² ã®ç¡é倧ãžã®äžžã ïŒè² ã®ç¡é倧ã«åãã£ãŠäžžããrtnïŒ
| 0
| -1
| 1
| -2
| 1
| -2
| 1
| -2
|
Wikipediaã®äžžãã«é¢ããè±èªã®èšäºã«ã¯ãã°ããã
説æããããŸãã ãã®äžã®
rte
ã¢ãŒãã¯ããå¶æ°ãã
rtz
ãåãäžãâãŒããã
rtz
ã
rtz
ãã
rtz
ã
rtz
ãã«å¯Ÿå¿ããŸãã
ããŒã¿ãå¥ã®ã¿ã€ãã®ããŒã¿ãšããŠè§£éãã
union
ã«å ããŠãOpenCLã§1ã€ã®ã¿ã€ãã®ããŒã¿ãå¥ã®ã¿ã€ãã®ããŒã¿ãšããŠè§£éããããã«ãã¹ã«ã©ãŒãšãã¯ãã«çšã®é¢æ°
as_()
ãã¡ããªãŒããããŸãã
float a = 25.0f; int b = as_int(a);
å
ã®åãšæ°ããåã®ãã€ãåäœã®ãµã€ãºãäžèŽããªãå Žåã
as_
ã¯ã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããŸãã
int a = 0; char b = as_char(a);
å
ã®åãšæ°ããåã®èŠçŽ ã®æ°ãäžèŽããªãå ŽåïŒãã ããåã®ãµã€ãºã¯åãã§ãïŒãçµæãOpenCLïŒå®è£
å®çŸ©ïŒã®å®è£
ã«äŸåããŸãããã ãããªãã©ã³ãã4ã³ã³ããŒãã³ããã¯ãã«ã§ãããçµæã3ã³ã³ããŒãã³ããã¯ãã«ã§ããå Žåã¯äŸå€ã§ãã ãããã£ãŠã32ãããã¯ãŒãã®ãã€ãããã¯ãã«èŠçŽ ãšããŠååŸãããšäŸ¿å©ã§ãã
uint word = 0x01020304; uchar4 bytes = as_uchar4(word);
ãã ãããã®å Žåã®çµæã¯ãç¹å®ã®OpenCLå®è£
ã®è£éã§ã
[1, 2, 3, 4]
[4, 3, 2, 1]
ãããã³
[1, 2, 3, 4]
ããŸãã¯ãã®ä»ã®ãã®ã«ãªããŸãã ãã ããOpenCLã®ããããã®ããŒãžã§ã³ãæé©åããŠäœæ¥ããå Žåã
as_
ãã®ãããªäœ¿çšã¯éåžžã«åãå
¥ããããŸãã
ãªãã©ã³ãã4æåã®ãã¯ãã«ã§ãããçµæã3æåã®ãã¯ãã«ã§ããå Žåã
as_
ãå
ã®åã®ãããã倿Žããã«è¿ãããã«å¿
èŠã§ã-æšæº
èŠçŽ ã®ãµã€ãºãåãå Žåã3ã€ã®ã³ã³ããŒãã³ãã®ãã¯ãã«ã®ãµã€ãºã¯4ã€ã®ã³ã³ããŒãã³ãã®ãã¯ãã«ã®ãµã€ãºã«çãããªããŸãã
float4 a = 1.0f; int3 b = as_int3(a);
ãããã«
OpenCL Cã¯ãéåžžã®C99ãšã®é¡äŒŒç¹ã§æœè¡çã§ãã ãã®èšäºãèªãã åŸã
- ãã¯ãã«ãªãã©ã«ãšæç€ºçãªãã£ã¹ããæ··åããªãã§ãã ããã
- ãã¯ãã«åã®è«çæŒç®åã«è©²åœããªãã§ãã ããã
- convert_ *ããã³as_ *颿°ãå
µåšåº«ã«è¿œå ããŸãã