oclh_h_ws_log_clapi_reps.c 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380
  1. /*
  2. * oclh_h_ws_log_clapi_reps.c
  3. * Author: havock
  4. */
  5. #include <string.h>
  6. #include <oclh_h_settings.h>
  7. #include <oclh_h_base_defs.h>
  8. #include <oclh_h_base_clapi_strings.h>
  9. #include <oclh_h_base_dev_clapi_wrappers.h>
  10. #include <oclh_h_ws_base_log.h>
  11. #include <oclh_h_ws_log_clapi_reps.h>
  12. #include <oclh_hd_std_types.clh>
  13. int32_t _ghf_logWS_PlatfInfo(const _GHT_WRKSET wSet,
  14. const cl_platform_id Platform,
  15. const char* const pcPrefix) {
  16. /* TODO: make ifdefs */
  17. cl_int clErr=0;
  18. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG],
  19. pchPlatfPrefix[_GHM_MAXLEN_OF_LOGMSG],
  20. *pcText=NULL;
  21. size_t szRes=0ul;
  22. cl_uint cluCnt=0ul;
  23. if(pcPrefix && pcPrefix[0])
  24. snprintf(pchPlatfPrefix, _GHM_MAXLEN_OF_LOGMSG,
  25. "%s platform_0x%04lx |",pcPrefix,__GHM_U64STRIPTO2B(Platform));
  26. else snprintf(pchPlatfPrefix, _GHM_MAXLEN_OF_LOGMSG,
  27. "platform_0x%04lx |", __GHM_U64STRIPTO2B(Platform));
  28. for(cluCnt=CL_PLATFORM_PROFILE; cluCnt<=CL_PLATFORM_EXTENSIONS; cluCnt++) {
  29. clErr=clGetPlatformInfo(Platform, cluCnt, 0ul, NULL, &szRes);
  30. if(clErr) snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  31. "%s %s: oclerr %s (%d)", pchPlatfPrefix,
  32. _ghf_PlatfPropString(cluCnt),
  33. _ghf_CLAPIErrString(clErr), clErr);
  34. else {
  35. pcText=malloc(szRes);
  36. if(pcText) {
  37. clErr=clGetPlatformInfo(Platform,cluCnt,szRes,pcText,&szRes);
  38. if(clErr)
  39. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  40. "%s %s: oclerr %s (%d)", pchPlatfPrefix,
  41. _ghf_PlatfPropString(cluCnt),
  42. _ghf_CLAPIErrString(clErr), clErr);
  43. else {
  44. pcText[szRes-1]='\0';
  45. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  46. "%s %s: %s", pchPlatfPrefix,
  47. _ghf_PlatfPropString(cluCnt), pcText);
  48. }
  49. if(pcText) { free(pcText); pcText=NULL; }
  50. } else snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  51. "%s %s: Undefined! Host memory allocation failed",
  52. pchPlatfPrefix, _ghf_PlatfPropString(cluCnt));
  53. }
  54. _ghf_logWS_Msg(wSet, pcLogMsg);
  55. }
  56. #ifdef CL_PLATFORM_HOST_TIMER_RESOLUTION
  57. {
  58. cl_ulong clulHTR=0ul;
  59. clErr=clGetPlatformInfo(Platform, CL_PLATFORM_HOST_TIMER_RESOLUTION,
  60. sizeof(cl_ulong), &clulHTR, &szRes);
  61. if(clErr)
  62. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  63. "%s The resolution of the host timer "
  64. "as used by clGetDeviceAndHostTimer: oclerr %s (%d)",
  65. pchPlatfPrefix, _ghf_CLAPIErrString(clErr), clErr);
  66. else {
  67. pcText[szRes-1]='\0';
  68. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  69. "%s The resolution of the host timer "
  70. "as used by clGetDeviceAndHostTimer: %lu nanosec",
  71. pchPlatfPrefix, (uint64_t)clulHTR);
  72. }
  73. }
  74. #endif /* CL_PLATFORM_HOST_TIMER_RESOLUTION */
  75. return(_GHM_OK);
  76. }
  77. int32_t _ghf_logWS_DevInfo( _GHT_WRKSET wSet,
  78. const cl_device_id clDev,
  79. const _GHE_LOGLVL LogLevel) {
  80. /**/
  81. #define __LOG(___LOGLVL_ARG,___TYPE_ARG,___KEY_ARG) \
  82. { if(LogLevel>=___LOGLVL_ARG) \
  83. _ghf_logWS_DevInf_ ## ___TYPE_ARG (wSet, clDev, \
  84. ___KEY_ARG, pcDev, \
  85. _ghf_DevPropSuffixString(___KEY_ARG,_GHE_RT_PREFIX), \
  86. _ghf_DevPropSuffixString(___KEY_ARG,_GHE_RT_POSTFIX)); }
  87. /**/
  88. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG], pcDev[64];
  89. snprintf(pcDev, 64ul, "dev_0x%04lx |", __GHM_U64STRIPTO2B(clDev));
  90. #ifdef CL_DEVICE_TYPE
  91. if(LogLevel>=_GHE_LOG_KEY_PARS) { /* type */
  92. size_t szRes=0ul;
  93. cl_device_type clDevType=0ul;
  94. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  95. wSet.APIErr=clGetDeviceInfo(clDev, CL_DEVICE_TYPE,
  96. sizeof(cl_device_type), &clDevType, &szRes);
  97. if(wSet.APIErr)
  98. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  99. "Undefined! clGetDeviceInfo returned %s(%d)",
  100. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  101. else {
  102. if(clDevType%2)
  103. strncat(pcStr, "default ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  104. if((clDevType>>1)%2)
  105. strncat(pcStr, "CPU ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  106. if((clDevType>>2)%2)
  107. strncat(pcStr, "GPU ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  108. if((clDevType>>3)%2)
  109. strncat(pcStr, "Accelerator ",
  110. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  111. }
  112. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG, "%s Type: %s", pcDev, pcStr);
  113. _ghf_logWS_Msg(wSet, pcLogMsg);
  114. }
  115. #endif /* CL_DEVICE_TYPE */
  116. #ifdef CL_DEVICE_VENDOR_ID
  117. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_VENDOR_ID)
  118. #endif /* CL_DEVICE_VENDOR_ID */
  119. #ifdef CL_DEVICE_MAX_COMPUTE_UNITS
  120. __LOG(_GHE_LOG_KEY_PARS, cluint, CL_DEVICE_MAX_COMPUTE_UNITS)
  121. #endif /* CL_DEVICE_MAX_COMPUTE_UNITS */
  122. #ifdef CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS
  123. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS)
  124. #endif /* CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS */
  125. #ifdef CL_DEVICE_MAX_WORK_ITEM_SIZES
  126. if(LogLevel>=_GHE_LOG_ALL) { /* max work-item sizes */
  127. size_t szRes=0ul;
  128. cl_uint cluInf=_ghf_getDevInf_cluint(clDev,
  129. CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS,
  130. &wSet.APIErr);
  131. size_t* pszDevInf=NULL;
  132. cl_uint cluCnt=0u;
  133. char pcVals[_GHM_MAXLEN_OF_LOGMSG]="\0";
  134. if(cluInf==(cl_uint) _GHM_UNDEFUINTVAL)
  135. snprintf(pcVals, _GHM_MAXLEN_OF_LOGMSG,
  136. "Undefined! clGetDeviceInfo returned %s(%d)",
  137. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  138. else {
  139. pszDevInf=malloc(cluInf*sizeof(size_t));
  140. if(pszDevInf) {
  141. wSet.APIErr=
  142. clGetDeviceInfo(clDev, CL_DEVICE_MAX_WORK_ITEM_SIZES,
  143. cluInf*sizeof(size_t),pszDevInf,&szRes);
  144. if(wSet.APIErr)
  145. snprintf(pcVals, _GHM_MAXLEN_OF_LOGMSG,
  146. "Undefined! clGetDeviceInfo returned %s(%d)",
  147. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  148. else {
  149. for(cluCnt=0u; cluCnt<cluInf; cluCnt++) {
  150. char pcVal[16]="\0";
  151. snprintf(pcVal, 16, "%lu", pszDevInf[cluCnt]);
  152. strncat(pcVals, pcVal,
  153. _GHM_MAXLEN_OF_LOGMSG-strlen(pcVals));
  154. if(cluCnt<cluInf-1) strncat(pcVals, ",", 1);
  155. }
  156. }
  157. if(pszDevInf) { free(pszDevInf); pszDevInf=NULL; }
  158. } else
  159. snprintf(pcVals, _GHM_MAXLEN_OF_LOGMSG,
  160. "Undefined! Host memory allocation failed");
  161. }
  162. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  163. "%s Max work-item sizes: %s ", pcDev, pcVals);
  164. _ghf_logWS_Msg(wSet, pcLogMsg);
  165. }
  166. #endif /* CL_DEVICE_MAX_WORK_ITEM_SIZES */
  167. #ifdef CL_DEVICE_MAX_WORK_GROUP_SIZE
  168. __LOG(_GHE_LOG_KEY_PARS, size, CL_DEVICE_MAX_WORK_GROUP_SIZE)
  169. #endif /* CL_DEVICE_MAX_WORK_GROUP_SIZE */
  170. if(LogLevel>=_GHE_LOG_ALL) { /* preferred vector sizes */
  171. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  172. "%s Preferred vector sizes:", pcDev);
  173. _ghf_logWS_Msg(wSet, pcLogMsg);
  174. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR
  175. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR)
  176. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR */
  177. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT
  178. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT)
  179. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT */
  180. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT
  181. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT)
  182. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT */
  183. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG
  184. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG)
  185. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG */
  186. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT
  187. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT)
  188. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT */
  189. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE
  190. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE)
  191. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE */
  192. #ifdef CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF
  193. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF)
  194. #endif /* CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF */
  195. }
  196. if(LogLevel>=_GHE_LOG_ALL) { /* native vector sizes */
  197. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  198. "%s Native vector sizes:", pcDev);
  199. _ghf_logWS_Msg(wSet, pcLogMsg);
  200. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR
  201. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR)
  202. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR */
  203. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT
  204. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT)
  205. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT */
  206. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_INT
  207. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT)
  208. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_INT */
  209. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG
  210. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG)
  211. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG */
  212. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT
  213. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT)
  214. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT */
  215. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE
  216. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE)
  217. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE */
  218. #ifdef CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF
  219. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF)
  220. #endif /* CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF */
  221. }
  222. #ifdef CL_DEVICE_MAX_CLOCK_FREQUENCY
  223. __LOG(_GHE_LOG_KEY_PARS, cluint, CL_DEVICE_MAX_CLOCK_FREQUENCY)
  224. #endif /* CL_DEVICE_MAX_CLOCK_FREQUENCY */
  225. #ifdef CL_DEVICE_ADDRESS_BITS
  226. __LOG(_GHE_LOG_KEY_PARS, cluint, CL_DEVICE_ADDRESS_BITS)
  227. #endif /* CL_DEVICE_ADDRESS_BITS */
  228. #ifdef CL_DEVICE_MAX_MEM_ALLOC_SIZE
  229. __LOG(_GHE_LOG_ALL, clulong, CL_DEVICE_MAX_MEM_ALLOC_SIZE)
  230. #endif /* CL_DEVICE_MAX_MEM_ALLOC_SIZE */
  231. #ifdef CL_DEVICE_IMAGE_SUPPORT
  232. if(LogLevel>=_GHE_LOG_ALL) { /* image support */
  233. cl_bool clbV=_ghf_getDevInf_bool(clDev,
  234. CL_DEVICE_IMAGE_SUPPORT, &wSet.APIErr);
  235. if(clbV==(cl_bool) _GHM_UNDEFUINTVAL) {
  236. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  237. "%s Image support: Undefined! "
  238. "clGetDeviceInfo returned %s(%d)", pcDev,
  239. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  240. _ghf_logWS_Msg(wSet, pcLogMsg);
  241. } else {
  242. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  243. "%s Image support: %s ", pcDev, (clbV)?"Yes":"No");
  244. _ghf_logWS_Msg(wSet, pcLogMsg);
  245. if(clbV) {
  246. #ifdef CL_DEVICE_MAX_READ_IMAGE_ARGS
  247. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_READ_IMAGE_ARGS)
  248. #endif /* CL_DEVICE_MAX_READ_IMAGE_ARGS */
  249. #ifdef CL_DEVICE_MAX_WRITE_IMAGE_ARGS
  250. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_WRITE_IMAGE_ARGS)
  251. #endif /* CL_DEVICE_MAX_WRITE_IMAGE_ARGS */
  252. #ifdef CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS
  253. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS)
  254. #endif /* CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS */
  255. #if defined(CL_DEVICE_IMAGE2D_MAX_WIDTH) && \
  256. defined(CL_DEVICE_IMAGE2D_MAX_HEIGHT)
  257. { /* 2D image max width and height */
  258. cl_int clLocErr[2]={ 0, 0 };
  259. size_t szWidth=
  260. _ghf_getDevInf_size(clDev,
  261. CL_DEVICE_IMAGE2D_MAX_WIDTH,
  262. &clLocErr[0]),
  263. szHeight=
  264. _ghf_getDevInf_size(clDev,
  265. CL_DEVICE_IMAGE2D_MAX_HEIGHT,
  266. &clLocErr[1]);
  267. if(szWidth !=(size_t)_GHM_UNDEFUINTVAL &&
  268. szHeight!=(size_t)_GHM_UNDEFUINTVAL)
  269. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  270. "%s Image support | "
  271. "Max 2D-image size (maxWidth x maxHeight): "
  272. "%lux%lu pixels", pcDev, szWidth, szHeight);
  273. else
  274. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  275. "%s Image support | "
  276. "Max 2D-image size (maxWidth x maxHeight): "
  277. "Undefined! oclerrs %s(%d) %s(%d)", pcDev,
  278. _ghf_CLAPIErrString(clLocErr[0]), clLocErr[0],
  279. _ghf_CLAPIErrString(clLocErr[1]), clLocErr[1]);
  280. _ghf_logWS_Msg(wSet, pcLogMsg);
  281. }
  282. #endif /* defined(CL_DEVICE_IMAGE2D_MAX_WIDTH) &&
  283. defined(CL_DEVICE_IMAGE2D_MAX_HEIGHT) */
  284. #if defined(CL_DEVICE_IMAGE3D_MAX_WIDTH) && \
  285. defined(CL_DEVICE_IMAGE3D_MAX_HEIGHT) && \
  286. defined(CL_DEVICE_IMAGE3D_MAX_DEPTH)
  287. { /* 3D image max width and height */
  288. cl_int clLocErr[3]={ 0, 0, 0 };
  289. size_t szWidth=
  290. _ghf_getDevInf_size(clDev,
  291. CL_DEVICE_IMAGE3D_MAX_WIDTH,
  292. &clLocErr[0]),
  293. szHeight=
  294. _ghf_getDevInf_size(clDev,
  295. CL_DEVICE_IMAGE3D_MAX_HEIGHT,
  296. &clLocErr[1]),
  297. szDepth=
  298. _ghf_getDevInf_size(clDev,
  299. CL_DEVICE_IMAGE3D_MAX_DEPTH,
  300. &clLocErr[2]);
  301. if(szWidth !=(size_t)_GHM_UNDEFUINTVAL &&
  302. szHeight!=(size_t)_GHM_UNDEFUINTVAL &&
  303. szDepth !=(size_t)_GHM_UNDEFUINTVAL)
  304. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  305. "%s Image support | Max 3D-image size "
  306. "(maxWidth x maxHeight x maxDepth): "
  307. "%lux%lux%lu pixels",
  308. pcDev, szWidth, szHeight, szDepth);
  309. else
  310. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  311. "%s Image support | Max 3D-image size "
  312. "(maxWidth x maxHeight x maxDepth): "
  313. "Undefined! oclerrs %s(%d) %s(%d) %s(%d)",
  314. pcDev,
  315. _ghf_CLAPIErrString(clLocErr[0]),clLocErr[0],
  316. _ghf_CLAPIErrString(clLocErr[1]),clLocErr[1],
  317. _ghf_CLAPIErrString(clLocErr[2]),clLocErr[2]);
  318. _ghf_logWS_Msg(wSet, pcLogMsg);
  319. }
  320. #endif /* defined(CL_DEVICE_IMAGE3D_MAX_WIDTH) &&
  321. defined(CL_DEVICE_IMAGE3D_MAX_HEIGHT) &&
  322. defined(CL_DEVICE_IMAGE3D_MAX_DEPTH) */
  323. #ifdef CL_DEVICE_IMAGE_MAX_BUFFER_SIZE
  324. __LOG(_GHE_LOG_ALL, size, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE)
  325. #endif /* CL_DEVICE_IMAGE_MAX_BUFFER_SIZE */
  326. #ifdef CL_DEVICE_IMAGE_MAX_ARRAY_SIZE
  327. __LOG(_GHE_LOG_ALL, size, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE)
  328. #endif /* CL_DEVICE_IMAGE_MAX_ARRAY_SIZE */
  329. #ifdef CL_DEVICE_MAX_SAMPLERS
  330. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_SAMPLERS)
  331. #endif /* CL_DEVICE_MAX_SAMPLERS */
  332. #ifdef CL_DEVICE_IMAGE_PITCH_ALIGNMENT
  333. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_IMAGE_PITCH_ALIGNMENT)
  334. #endif /* CL_DEVICE_IMAGE_PITCH_ALIGNMENT */
  335. #ifdef CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT
  336. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT)
  337. #endif /* CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT */
  338. }
  339. }
  340. }
  341. #endif /* CL_DEVICE_IMAGE_SUPPORT */
  342. #ifdef CL_DEVICE_MAX_PIPE_ARGS
  343. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_PIPE_ARGS)
  344. #endif /* CL_DEVICE_MAX_PIPE_ARGS */
  345. #ifdef CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS
  346. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS)
  347. #endif /* CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS */
  348. #ifdef CL_DEVICE_PIPE_MAX_PACKET_SIZE
  349. __LOG(_GHE_LOG_ALL, cluint_as_bytes, CL_DEVICE_PIPE_MAX_PACKET_SIZE)
  350. #endif /* CL_DEVICE_PIPE_MAX_PACKET_SIZE */
  351. #ifdef CL_DEVICE_MAX_PARAMETER_SIZE
  352. __LOG(_GHE_LOG_ALL, size, CL_DEVICE_MAX_PARAMETER_SIZE)
  353. #endif /* CL_DEVICE_MAX_PARAMETER_SIZE */
  354. #ifdef CL_DEVICE_MEM_BASE_ADDR_ALIGN
  355. __LOG(_GHE_LOG_KEY_PARS, cluint, CL_DEVICE_MEM_BASE_ADDR_ALIGN)
  356. #endif /* CL_DEVICE_MEM_BASE_ADDR_ALIGN */
  357. #ifdef CL_DEVICE_SINGLE_FP_CONFIG
  358. if(LogLevel>=_GHE_LOG_ALL) {
  359. /* supported single precision floating-point capabilities */
  360. size_t szRes=0;
  361. cl_device_fp_config cldfpcInf;
  362. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  363. wSet.APIErr=
  364. clGetDeviceInfo(clDev, CL_DEVICE_SINGLE_FP_CONFIG,
  365. sizeof(cl_device_fp_config), &cldfpcInf, &szRes);
  366. if(cldfpcInf==(cl_device_fp_config)_GHM_UNDEFUINTVAL)
  367. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  368. "Undefined! clGetDeviceInfo returned %s(%d)",
  369. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  370. else {
  371. if(cldfpcInf%2)
  372. strncat(pcStr, "denorms; ",_GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  373. if((cldfpcInf>>1)%2)
  374. strncat(pcStr, "INF and quiet NaNs; ",
  375. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  376. if((cldfpcInf>>2)%2)
  377. strncat(pcStr, "round to nearest; ",
  378. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  379. if((cldfpcInf>>3)%2)
  380. strncat(pcStr, "round to zero; ",
  381. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  382. if((cldfpcInf>>4)%2)
  383. strncat(pcStr, "round to +/-infinity; ",
  384. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  385. if((cldfpcInf>>5)%2)
  386. strncat(pcStr, "IEEE754-2008 fused multiply-add; ",
  387. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  388. if((cldfpcInf>>6)%2)
  389. strncat(pcStr, "basic floating-point operations; ",
  390. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  391. }
  392. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  393. "%s Supported "
  394. "single precision floating-point capabilities: %s",
  395. pcDev, pcStr);
  396. _ghf_logWS_Msg(wSet, pcLogMsg);
  397. }
  398. #endif /* CL_DEVICE_SINGLE_FP_CONFIG */
  399. #ifdef CL_DEVICE_DOUBLE_FP_CONFIG
  400. if(LogLevel>=_GHE_LOG_ALL) {
  401. /* supported double precision floating-point capabilities */
  402. size_t szRes=0ul;
  403. cl_device_fp_config cldfpcInf;
  404. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  405. wSet.APIErr=
  406. clGetDeviceInfo(clDev, CL_DEVICE_DOUBLE_FP_CONFIG,
  407. sizeof(cl_device_fp_config), &cldfpcInf, &szRes);
  408. if(cldfpcInf==(cl_device_fp_config)_GHM_UNDEFUINTVAL)
  409. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  410. "Undefined! clGetDeviceInfo returned %s(%d)",
  411. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  412. else {
  413. if(cldfpcInf==0) strncat(pcStr, "unsupported",
  414. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  415. else {
  416. if(cldfpcInf%2) strncat(pcStr, "denorms; ",
  417. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  418. if((cldfpcInf>>1)%2)
  419. strncat(pcStr, "INF and quiet NaNs; ",
  420. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  421. if((cldfpcInf>>2)%2)
  422. strncat(pcStr, "round to nearest; ",
  423. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  424. if((cldfpcInf>>3)%2)
  425. strncat(pcStr, "round to zero; ",
  426. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  427. if((cldfpcInf>>4)%2)
  428. strncat(pcStr, "round to +/-infinity; ",
  429. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  430. if((cldfpcInf>>5)%2)
  431. strncat(pcStr, "IEEE754-2008 fused multiply-add; ",
  432. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  433. if((cldfpcInf>>6)%2)
  434. strncat(pcStr, "basic floating-point operations; ",
  435. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  436. }
  437. }
  438. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  439. "%s Double precision floating-point support: %s",pcDev,pcStr);
  440. _ghf_logWS_Msg(wSet, pcLogMsg);
  441. }
  442. #endif /* CL_DEVICE_DOUBLE_FP_CONFIG */
  443. #ifdef CL_DEVICE_GLOBAL_MEM_CACHE_TYPE
  444. if(LogLevel>=_GHE_LOG_ALL) { /* global memory cache support */
  445. size_t szRes=0ul;
  446. cl_device_mem_cache_type cldmctInf;
  447. char pcStr[32]="\0";
  448. wSet.APIErr=
  449. clGetDeviceInfo(clDev, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE,
  450. sizeof(cl_device_mem_cache_type),&cldmctInf,&szRes);
  451. if(cldmctInf==(cl_device_mem_cache_type)_GHM_UNDEFUINTVAL)
  452. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  453. "Undefined! clGetDeviceInfo returned %s(%d)",
  454. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  455. else {
  456. if(cldmctInf==0) strncpy(pcStr, "No", sizeof(pcStr));
  457. if(cldmctInf==1) strncpy(pcStr, "read only", sizeof(pcStr));
  458. if(cldmctInf==2) strncpy(pcStr, "read-write", sizeof(pcStr));
  459. }
  460. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  461. "%s Global memory cache support: %s", pcDev, pcStr);
  462. _ghf_logWS_Msg(wSet, pcLogMsg);
  463. }
  464. #endif /* CL_DEVICE_GLOBAL_MEM_CACHE_TYPE */
  465. #ifdef CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE
  466. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE)
  467. #endif /* CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE */
  468. #ifdef CL_DEVICE_GLOBAL_MEM_CACHE_SIZE
  469. __LOG(_GHE_LOG_ALL, clulong, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE)
  470. #endif /* CL_DEVICE_GLOBAL_MEM_CACHE_SIZE */
  471. #ifdef CL_DEVICE_GLOBAL_MEM_SIZE
  472. __LOG(_GHE_LOG_KEY_PARS, clulong, CL_DEVICE_GLOBAL_MEM_SIZE)
  473. #endif /* CL_DEVICE_GLOBAL_MEM_SIZE */
  474. #ifdef CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE
  475. __LOG(_GHE_LOG_ALL, clulong, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE)
  476. #endif /* CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE */
  477. #ifdef CL_DEVICE_MAX_CONSTANT_ARGS
  478. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_CONSTANT_ARGS)
  479. #endif /* CL_DEVICE_MAX_CONSTANT_ARGS */
  480. #ifdef CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE
  481. __LOG(_GHE_LOG_ALL, size_as_bytes, CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE)
  482. #endif /* CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE */
  483. #ifdef CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE
  484. __LOG(_GHE_LOG_ALL,size_as_bytes,CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE)
  485. #endif /* CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE */
  486. #ifdef CL_DEVICE_LOCAL_MEM_TYPE
  487. if(LogLevel>=_GHE_LOG_ALL) { /* Type of local memory supported */
  488. size_t szRes=0ul;
  489. cl_device_local_mem_type cldlmtInf;
  490. char pcStringType[_GHM_MAXLEN_OF_LOGMSG]="\0";
  491. wSet.APIErr=
  492. clGetDeviceInfo(clDev, CL_DEVICE_LOCAL_MEM_TYPE,
  493. sizeof(cl_device_local_mem_type),&cldlmtInf,&szRes);
  494. if(cldlmtInf==(cl_device_local_mem_type)_GHM_UNDEFUINTVAL)
  495. snprintf(pcStringType, _GHM_MAXLEN_OF_LOGMSG,
  496. "Undefined! clGetDeviceInfo returned %s(%d)",
  497. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  498. else {
  499. if(cldlmtInf==1) strncpy(pcStringType, "local",
  500. sizeof(pcStringType));
  501. if(cldlmtInf==2) strncpy(pcStringType, "global",
  502. sizeof(pcStringType));
  503. }
  504. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  505. "%s Type of local memory supported: %s", pcDev, pcStringType);
  506. _ghf_logWS_Msg(wSet, pcLogMsg);
  507. }
  508. #endif /* CL_DEVICE_LOCAL_MEM_TYPE */
  509. #ifdef CL_DEVICE_LOCAL_MEM_SIZE
  510. __LOG(_GHE_LOG_ALL, clulong, CL_DEVICE_LOCAL_MEM_SIZE)
  511. #endif /* CL_DEVICE_LOCAL_MEM_SIZE */
  512. #ifdef CL_DEVICE_ERROR_CORRECTION_SUPPORT
  513. if(LogLevel>=_GHE_LOG_ALL)
  514. _ghf_logWS_DevInf_bool(wSet, clDev,
  515. CL_DEVICE_ERROR_CORRECTION_SUPPORT, pcDev,
  516. "Error correction support:", "Yes", "No");
  517. #endif /* CL_DEVICE_ERROR_CORRECTION_SUPPORT */
  518. #ifdef CL_DEVICE_PROFILING_TIMER_RESOLUTION
  519. __LOG(_GHE_LOG_KEY_PARS, size, CL_DEVICE_PROFILING_TIMER_RESOLUTION)
  520. #endif /* CL_DEVICE_PROFILING_TIMER_RESOLUTION */
  521. #ifdef CL_DEVICE_ENDIAN_LITTLE
  522. if(LogLevel>=_GHE_LOG_KEY_PARS)
  523. _ghf_logWS_DevInf_bool(wSet, clDev,
  524. CL_DEVICE_ENDIAN_LITTLE, pcDev,
  525. "Endianness:", "little-endian", "big-endian");
  526. #endif /* CL_DEVICE_ENDIAN_LITTLE */
  527. #ifdef CL_DEVICE_AVAILABLE
  528. if(LogLevel>=_GHE_LOG_KEY_PARS)
  529. _ghf_logWS_DevInf_bool(wSet, clDev,
  530. CL_DEVICE_AVAILABLE, pcDev,
  531. "Is device available:", "Yes", "No");
  532. #endif /* CL_DEVICE_AVAILABLE */
  533. #ifdef CL_DEVICE_COMPILER_AVAILABLE
  534. if(LogLevel>=_GHE_LOG_KEY_PARS)
  535. _ghf_logWS_DevInf_bool(wSet, clDev,
  536. CL_DEVICE_COMPILER_AVAILABLE, pcDev,
  537. "Is device compiler available:", "Yes", "No");
  538. #endif /* CL_DEVICE_COMPILER_AVAILABLE */
  539. #ifdef CL_DEVICE_LINKER_AVAILABLE
  540. if(LogLevel>=_GHE_LOG_KEY_PARS)
  541. _ghf_logWS_DevInf_bool(wSet, clDev,
  542. CL_DEVICE_LINKER_AVAILABLE, pcDev,
  543. "Is device linker available:", "Yes", "No");
  544. #endif /* CL_DEVICE_LINKER_AVAILABLE */
  545. /*
  546. * TODO: CL_DEVICE_IL_VERSION
  547. */
  548. #ifdef CL_DEVICE_EXECUTION_CAPABILITIES
  549. if(LogLevel>=_GHE_LOG_ALL) { /* supported execution capabilities */
  550. size_t szRes=0ul;
  551. cl_device_exec_capabilities cldecInf;
  552. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  553. wSet.APIErr=
  554. clGetDeviceInfo(clDev, CL_DEVICE_EXECUTION_CAPABILITIES,
  555. sizeof(cl_device_exec_capabilities),
  556. &cldecInf, &szRes);
  557. if(cldecInf==(cl_device_exec_capabilities)_GHM_UNDEFUINTVAL)
  558. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  559. "Undefined! clGetDeviceInfo returned %s(%d)",
  560. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  561. else {
  562. if(cldecInf==0)
  563. strncat(pcStr,"unsupported",
  564. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  565. else {
  566. if(cldecInf%2)
  567. strncat(pcStr, "OpenCL kernels; ",
  568. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  569. if((cldecInf>>1)%2)
  570. strncat(pcStr, "native kernels; ",
  571. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  572. }
  573. }
  574. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  575. "%s Execution capabilities of the device: %s", pcDev, pcStr);
  576. _ghf_logWS_Msg(wSet, pcLogMsg);
  577. }
  578. #endif /* CL_DEVICE_EXECUTION_CAPABILITIES */
  579. #ifdef CL_DEVICE_QUEUE_PROPERTIES
  580. if(LogLevel>=_GHE_LOG_ALL) {
  581. /* command-queue properties supported by the device */
  582. size_t szRes=0ul;
  583. cl_command_queue_properties clcqpInf;
  584. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  585. wSet.APIErr=
  586. clGetDeviceInfo(clDev, CL_DEVICE_QUEUE_PROPERTIES,
  587. sizeof(cl_command_queue_properties),
  588. &clcqpInf, &szRes);
  589. if(clcqpInf==(cl_command_queue_properties)_GHM_UNDEFUINTVAL)
  590. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  591. "Undefined! clGetDeviceInfo returned %s(%d)",
  592. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  593. else {
  594. if(clcqpInf==0)
  595. strncat(pcStr, "unsupported",
  596. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  597. else {
  598. if(clcqpInf%2)
  599. strncat(pcStr, "out of order execution mode; ",
  600. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  601. if((clcqpInf>>1)%2)
  602. strncat(pcStr, "profiling; ",
  603. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  604. if((clcqpInf>>2)%2)
  605. strncat(pcStr, "device queue; ",
  606. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  607. if((clcqpInf>>3)%2)
  608. strncat(pcStr, "default device queue; ",
  609. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  610. }
  611. }
  612. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  613. "%s Command-queue properties supported by the device: %s",
  614. pcDev, pcStr);
  615. _ghf_logWS_Msg(wSet, pcLogMsg);
  616. }
  617. #endif /* CL_DEVICE_QUEUE_PROPERTIES */
  618. #ifdef CL_DEVICE_QUEUE_ON_HOST_PROPERTIES
  619. if(LogLevel>=_GHE_LOG_ALL) {
  620. /* host command-queue properties supported by the device */
  621. size_t szRes=0ul;
  622. cl_command_queue_properties clcqpInf;
  623. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  624. wSet.APIErr=
  625. clGetDeviceInfo(clDev, CL_DEVICE_QUEUE_ON_HOST_PROPERTIES,
  626. sizeof(cl_command_queue_properties),
  627. &clcqpInf, &szRes);
  628. if(clcqpInf==(cl_command_queue_properties)_GHM_UNDEFUINTVAL)
  629. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  630. "Undefined! clGetDeviceInfo returned %s(%d)",
  631. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  632. else {
  633. if(clcqpInf==0)
  634. strncat(pcStr, "unsupported",
  635. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  636. else {
  637. if(clcqpInf%2)
  638. strncat(pcStr, "out of order execution mode; ",
  639. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  640. if((clcqpInf>>1)%2)
  641. strncat(pcStr, "profiling; ",
  642. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  643. if((clcqpInf>>2)%2)
  644. strncat(pcStr, "device queue; ",
  645. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  646. if((clcqpInf>>3)%2)
  647. strncat(pcStr, "default device queue; ",
  648. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  649. }
  650. }
  651. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  652. "%s Host command-queue properties supported by the device: %s",
  653. pcDev, pcStr);
  654. _ghf_logWS_Msg(wSet, pcLogMsg);
  655. }
  656. #endif /* CL_DEVICE_QUEUE_ON_HOST_PROPERTIES */
  657. #ifdef CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES
  658. if(LogLevel>=_GHE_LOG_ALL) {
  659. /* device command-queue properties supported by the device */
  660. size_t szRes=0ul;
  661. cl_command_queue_properties clcqpInf;
  662. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  663. wSet.APIErr=
  664. clGetDeviceInfo(clDev, CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES,
  665. sizeof(cl_command_queue_properties),
  666. &clcqpInf, &szRes);
  667. if(clcqpInf==(cl_command_queue_properties)_GHM_UNDEFUINTVAL)
  668. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  669. "Undefined! clGetDeviceInfo returned %s(%d)",
  670. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  671. else {
  672. if(clcqpInf==0)
  673. strncat(pcStr, "unsupported",
  674. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  675. else {
  676. if(clcqpInf%2)
  677. strncat(pcStr, "out of order execution mode; ",
  678. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  679. if((clcqpInf>>1)%2)
  680. strncat(pcStr, "profiling; ",
  681. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  682. if((clcqpInf>>2)%2)
  683. strncat(pcStr, "device queue; ",
  684. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  685. if((clcqpInf>>3)%2)
  686. strncat(pcStr, "default device queue; ",
  687. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  688. }
  689. }
  690. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  691. "%s Device command-queue properties supported by "
  692. "the device: %s", pcDev, pcStr);
  693. _ghf_logWS_Msg(wSet, pcLogMsg);
  694. }
  695. #endif /* CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES */
  696. #ifdef CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE
  697. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE)
  698. #endif /* CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE */
  699. #ifdef CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE
  700. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE)
  701. #endif /* CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE */
  702. #ifdef CL_DEVICE_MAX_ON_DEVICE_QUEUES
  703. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_ON_DEVICE_QUEUES)
  704. #endif /* CL_DEVICE_MAX_ON_DEVICE_QUEUES */
  705. #ifdef CL_DEVICE_MAX_ON_DEVICE_EVENTS
  706. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_ON_DEVICE_EVENTS)
  707. #endif /* CL_DEVICE_MAX_ON_DEVICE_EVENTS */
  708. #ifdef CL_DEVICE_BUILT_IN_KERNELS
  709. __LOG(_GHE_LOG_ALL, charptr, CL_DEVICE_BUILT_IN_KERNELS)
  710. #endif /* CL_DEVICE_BUILT_IN_KERNELS */
  711. #ifdef CL_DEVICE_PLATFORM
  712. if(LogLevel>=_GHE_LOG_KEY_PARS) {
  713. cl_platform_id clPlatf=
  714. (cl_platform_id)_ghf_getDevInf_uintptr(clDev, CL_DEVICE_PLATFORM,
  715. &wSet.APIErr);
  716. if(clPlatf) {
  717. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG, /* ??????? */
  718. "%s Platform: %04lx", pcDev, __GHM_U64STRIPTO2B(clPlatf));
  719. char pcTmpPrefix[64]="\0";
  720. snprintf(pcTmpPrefix, 64, "%s ", pcDev);
  721. _ghf_logWS_PlatfInfo(wSet,clPlatf,pcTmpPrefix);
  722. } else {
  723. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  724. "%s Platform: Undefined! clGetDeviceInfo returned %s(%d)",
  725. pcDev, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  726. _ghf_logWS_Msg(wSet, pcLogMsg);
  727. }
  728. }
  729. #endif /* CL_DEVICE_PLATFORM */
  730. #ifdef CL_DEVICE_NAME
  731. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_NAME)
  732. #endif /* CL_DEVICE_NAME */
  733. #ifdef CL_DEVICE_VENDOR
  734. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_VENDOR)
  735. #endif /* CL_DEVICE_VENDOR */
  736. #ifdef CL_DRIVER_VERSION
  737. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DRIVER_VERSION)
  738. #endif /* CL_DRIVER_VERSION */
  739. #ifdef CL_DEVICE_PROFILE
  740. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_PROFILE)
  741. #endif /* CL_DEVICE_PROFILE */
  742. #ifdef CL_DEVICE_VERSION
  743. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_VERSION)
  744. #endif /* CL_DEVICE_VERSION */
  745. #ifdef CL_DEVICE_OPENCL_C_VERSION
  746. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_OPENCL_C_VERSION)
  747. #endif /* CL_DEVICE_OPENCL_C_VERSION */
  748. #ifdef CL_DEVICE_EXTENSIONS
  749. __LOG(_GHE_LOG_KEY_PARS, charptr, CL_DEVICE_EXTENSIONS)
  750. #endif /* CL_DEVICE_EXTENSIONS */
  751. #ifdef CL_DEVICE_PRINTF_BUFFER_SIZE
  752. __LOG(_GHE_LOG_KEY_PARS, size, CL_DEVICE_PRINTF_BUFFER_SIZE)
  753. #endif /* CL_DEVICE_PRINTF_BUFFER_SIZE */
  754. #ifdef CL_DEVICE_PREFERRED_INTEROP_USER_SYNC
  755. if(LogLevel>=_GHE_LOG_ALL)
  756. _ghf_logWS_DevInf_bool(wSet, clDev,
  757. CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, pcDev,
  758. "Is device preferred for "
  759. "the user's responsibility for sync:",
  760. "Yes", "No");
  761. #endif /* CL_DEVICE_PREFERRED_INTEROP_USER_SYNC */
  762. #ifdef CL_DEVICE_PARENT_DEVICE
  763. __LOG(_GHE_LOG_ALL, clulong_as_hex, CL_DEVICE_PARENT_DEVICE)
  764. #endif /* CL_DEVICE_PARENT_DEVICE */
  765. #ifdef CL_DEVICE_PARTITION_MAX_SUB_DEVICES
  766. __LOG(_GHE_LOG_KEY_PARS, cluint, CL_DEVICE_PARTITION_MAX_SUB_DEVICES)
  767. #endif /* CL_DEVICE_PARTITION_MAX_SUB_DEVICES */
  768. /*
  769. * TODO:
  770. * CL_DEVICE_PARTITION_PROPERTIES
  771. * CL_DEVICE_PARTITION_AFFINITY_DOMAIN
  772. * CL_DEVICE_PARTITION_TYPE
  773. */
  774. #ifdef CL_DEVICE_REFERENCE_COUNT
  775. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_REFERENCE_COUNT)
  776. #endif /* CL_DEVICE_REFERENCE_COUNT */
  777. #ifdef CL_DEVICE_SVM_CAPABILITIES
  778. if(LogLevel>=_GHE_LOG_ALL) {
  779. /* shared virtual memory allocation types the device supports */
  780. size_t szRes=0ul;
  781. cl_device_svm_capabilities cldsvmcInf;
  782. char pcStr[_GHM_MAXLEN_OF_LOGMSG]="\0";
  783. wSet.APIErr=
  784. clGetDeviceInfo(clDev, CL_DEVICE_SVM_CAPABILITIES,
  785. sizeof(cl_device_svm_capabilities),
  786. &cldsvmcInf, &szRes);
  787. if(cldsvmcInf==(cl_device_svm_capabilities)_GHM_UNDEFUINTVAL)
  788. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  789. "Undefined! clGetDeviceInfo returned %s(%d)",
  790. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  791. else {
  792. if(cldsvmcInf==0)
  793. strncat(pcStr, "unsupported",
  794. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  795. else {
  796. if(cldsvmcInf%2)
  797. strncat(pcStr,
  798. "coarse-grain buffer sharing using clSVMAlloc; ",
  799. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  800. if((cldsvmcInf>>1)%2)
  801. strncat(pcStr,
  802. "fine-grain buffer sharing using clSVMAlloc; ",
  803. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  804. if((cldsvmcInf>>2)%2)
  805. strncat(pcStr,
  806. "sharing the host’s entire virtual memory "
  807. "including memory allocated using malloc; ",
  808. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  809. if((cldsvmcInf>>3)%2)
  810. strncat(pcStr,
  811. "atomic operations provide memory consistency "
  812. "across the host and all devices supporting "
  813. "fine-grain allocations; ",
  814. _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  815. }
  816. }
  817. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  818. "%s Shared virtual memory allocation types "
  819. "the device supports: %s", pcDev, pcStr);
  820. _ghf_logWS_Msg(wSet, pcLogMsg);
  821. }
  822. #endif /* CL_DEVICE_SVM_CAPABILITIES */
  823. #ifdef CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT
  824. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT)
  825. #endif /* CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT */
  826. #ifdef CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT
  827. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT)
  828. #endif /* CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT */
  829. #ifdef CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT
  830. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT)
  831. #endif /* CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT */
  832. #ifdef CL_DEVICE_MAX_NUM_SUB_GROUPS
  833. __LOG(_GHE_LOG_ALL, cluint, CL_DEVICE_MAX_NUM_SUB_GROUPS)
  834. #endif /* CL_DEVICE_MAX_NUM_SUB_GROUPS */
  835. /*
  836. * TODO: CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS
  837. */
  838. return(_GHM_OK);
  839. /**/
  840. #undef __LOG
  841. /**/
  842. }
  843. int32_t _ghf_logWS_DevInfoShort( _GHT_WRKSET wSet,
  844. const cl_device_id clDev,
  845. const char* const pcPrefix) {
  846. /* TODO: make ifdefs */
  847. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG] ="\0",
  848. pcStr[_GHM_MAXLEN_OF_LOGMSG] ="\0",
  849. pcDevPrefix[_GHM_MAXLEN_OF_LOGMSG]="\0";
  850. size_t szRes=0ul;
  851. cl_device_type clDevType=0ul;
  852. if(pcPrefix && pcPrefix[0])
  853. snprintf(pcDevPrefix, _GHM_MAXLEN_OF_LOGMSG,
  854. "%s dev_0x%04lx |", pcPrefix, __GHM_U64STRIPTO2B(clDev));
  855. else snprintf(pcDevPrefix, _GHM_MAXLEN_OF_LOGMSG,
  856. "dev_0x%04lx |", __GHM_U64STRIPTO2B(clDev));
  857. wSet.APIErr=
  858. clGetDeviceInfo(clDev, CL_DEVICE_TYPE,
  859. sizeof(cl_device_type),&clDevType,&szRes);
  860. if(wSet.APIErr)
  861. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  862. "Undefined! clGetDeviceInfo/CL_DEVICE_TYPE returned %s(%d)",
  863. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  864. else {
  865. if(clDevType%2)
  866. strncat(pcStr, "default", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  867. if((clDevType>>1)%2)
  868. strncat(pcStr, "CPU", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  869. if((clDevType>>2)%2)
  870. strncat(pcStr, "GPU", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  871. if((clDevType>>3)%2)
  872. strncat(pcStr, "Accelerator", _GHM_MAXLEN_OF_LOGMSG-strlen(pcStr));
  873. }
  874. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  875. "%s %s: %u units/%u MHz/%lu ns timer/%s", pcDevPrefix, pcStr,
  876. _ghf_getDevInf_cluint(clDev, CL_DEVICE_MAX_COMPUTE_UNITS,
  877. &wSet.APIErr),
  878. _ghf_getDevInf_cluint(clDev, CL_DEVICE_MAX_CLOCK_FREQUENCY,
  879. &wSet.APIErr),
  880. _ghf_getDevInf_size( clDev, CL_DEVICE_PROFILING_TIMER_RESOLUTION,
  881. &wSet.APIErr),
  882. _ghf_getDevInf_bool( clDev, CL_DEVICE_ENDIAN_LITTLE,
  883. &wSet.APIErr)?"little-endian":"big-endian");
  884. _ghf_logWS_Msg(wSet, pcLogMsg);
  885. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  886. "%s Memory: %.3f MiB/%u bits address ", pcDevPrefix,
  887. ((flt32_t)_ghf_getDevInf_clulong(clDev, CL_DEVICE_GLOBAL_MEM_SIZE,
  888. &wSet.APIErr))/1024e0f/1024e0f,
  889. _ghf_getDevInf_cluint(clDev, CL_DEVICE_ADDRESS_BITS,&wSet.APIErr));
  890. _ghf_logWS_Msg(wSet, pcLogMsg);
  891. _ghf_logWS_DevInf_charptr(wSet,clDev, CL_DEVICE_VENDOR,
  892. pcDevPrefix, "Vendor:","");
  893. _ghf_logWS_DevInf_charptr(wSet,clDev, CL_DEVICE_NAME, pcDevPrefix,
  894. "Model:","");
  895. {
  896. char* pcHWvers=NULL, *pcHWlang=NULL;
  897. pcStr[0]='\0';
  898. pcHWvers=_ghf_getDevInf_charptr(clDev, CL_DEVICE_VERSION, &wSet.APIErr);
  899. if(wSet.APIErr || !pcHWvers)
  900. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  901. "Undefined! clGetDeviceInfo/CL_DEVICE_VERSION "
  902. "returned %s(%d)",
  903. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  904. pcHWlang=_ghf_getDevInf_charptr(clDev, CL_DEVICE_OPENCL_C_VERSION,
  905. &wSet.APIErr);
  906. if(wSet.APIErr || !pcHWlang)
  907. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  908. "Undefined! clGetDeviceInfo/CL_DEVICE_OPENCL_C_VERSION "
  909. "returned %s(%d)",
  910. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  911. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  912. "%s HW/lang versions: %s / %s",
  913. pcDevPrefix, pcHWvers?pcHWvers:pcStr, pcHWlang?pcHWlang:pcStr);
  914. if(pcHWvers) { free(pcHWvers); pcHWvers=NULL; }
  915. if(pcHWlang) { free(pcHWlang); pcHWlang=NULL; }
  916. _ghf_logWS_Msg(wSet, pcLogMsg);
  917. }
  918. {
  919. char* pcDRVvers=
  920. _ghf_getDevInf_charptr(clDev, CL_DRIVER_VERSION, &wSet.APIErr);
  921. if(wSet.APIErr || !pcDRVvers)
  922. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  923. "Undefined! clGetDeviceInfo/CL_DRIVER_VERSION "
  924. "returned %s(%d)",
  925. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  926. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  927. "%s Driver version: %s",pcDevPrefix,pcDRVvers?pcDRVvers:pcStr);
  928. if(pcDRVvers) { free(pcDRVvers); pcDRVvers=NULL; }
  929. _ghf_logWS_Msg(wSet, pcLogMsg);
  930. }
  931. {
  932. uint64_t off=0ul;
  933. cl_platform_id clplidPlatf=
  934. (cl_platform_id)_ghf_getDevInf_uintptr(clDev,CL_DEVICE_PLATFORM,
  935. &wSet.APIErr);
  936. if(wSet.APIErr)
  937. off+=(uint64_t)snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  938. "Undefined! "
  939. "clGetDeviceInfo/CL_PLATFORM_NAME "
  940. "returned %s(%d)",
  941. _ghf_CLAPIErrString(wSet.APIErr),
  942. wSet.APIErr);
  943. wSet.APIErr=clGetPlatformInfo(clplidPlatf, CL_PLATFORM_NAME, 0ul,
  944. NULL, &szRes);
  945. if(wSet.APIErr) {
  946. off+=(uint64_t)snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  947. "Undefined! "
  948. "clGetPlatformInfo/CL_PLATFORM_NAME "
  949. "returned %s(%d)",
  950. _ghf_CLAPIErrString(wSet.APIErr),
  951. wSet.APIErr);
  952. } else {
  953. wSet.APIErr=clGetPlatformInfo(clplidPlatf, CL_PLATFORM_NAME,
  954. _GHM_MAXLEN_OF_LOGMSG-1ul, pcStr,
  955. &szRes);
  956. if(wSet.APIErr) {
  957. off+=(uint64_t)snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  958. "Undefined! "
  959. "clGetPlatformInfo/CL_PLATFORM_NAME "
  960. "returned %s(%d)",
  961. _ghf_CLAPIErrString(wSet.APIErr),
  962. wSet.APIErr);
  963. } else off+=(szRes-1ul);
  964. }
  965. off+=(uint64_t)snprintf(&pcStr[off], _GHM_MAXLEN_OF_LOGMSG, " - ver. ");
  966. wSet.APIErr=clGetPlatformInfo(clplidPlatf, CL_PLATFORM_VERSION, 0ul,
  967. NULL, &szRes);
  968. if(wSet.APIErr) {
  969. snprintf(&pcStr[off], _GHM_MAXLEN_OF_LOGMSG,
  970. "Undefined! clGetPlatformInfo/CL_PLATFORM_VERSION "
  971. "returned %s(%d)",
  972. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  973. } else {
  974. wSet.APIErr=clGetPlatformInfo(clplidPlatf, CL_PLATFORM_VERSION,
  975. _GHM_MAXLEN_OF_LOGMSG-off,&pcStr[off],
  976. &szRes);
  977. if(wSet.APIErr)
  978. snprintf(&pcStr[off], _GHM_MAXLEN_OF_LOGMSG,
  979. "Undefined! clGetPlatformInfo/CL_PLATFORM_VERSION "
  980. "returned %s(%d)",
  981. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  982. }
  983. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  984. "%s SW-version: %s", pcDevPrefix, pcStr);
  985. _ghf_logWS_Msg(wSet, pcLogMsg);
  986. }
  987. {
  988. char* pcExtensions=
  989. _ghf_getDevInf_charptr(clDev, CL_DEVICE_EXTENSIONS, &wSet.APIErr);
  990. if(wSet.APIErr || !pcExtensions)
  991. snprintf(pcStr, _GHM_MAXLEN_OF_LOGMSG,
  992. "Undefined! clGetDeviceInfo/CL_DRIVER_VERSION "
  993. "returned %s(%d)",
  994. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  995. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  996. "%s Extensions: %s",pcDevPrefix,
  997. pcExtensions?pcExtensions:pcStr);
  998. if(pcExtensions) { free(pcExtensions); pcExtensions=NULL; }
  999. _ghf_logWS_Msg(wSet, pcLogMsg);
  1000. }
  1001. return(_GHM_OK);
  1002. }
  1003. int32_t _ghf_logWS_ContextInfo( _GHT_WRKSET wSet,
  1004. const cl_context clCtx,
  1005. const _GHE_LOGLVL LogLevel) {
  1006. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG], pcCtx[64];
  1007. size_t szRes=0ul;
  1008. cl_uint cluInf=0u;
  1009. snprintf(pcCtx, 64ul, "context_0x%04lx |", __GHM_U64STRIPTO2B(clCtx));
  1010. #ifdef CL_CONTEXT_REFERENCE_COUNT
  1011. if(LogLevel>=_GHE_LOG_ALL) { /* refcount */
  1012. wSet.APIErr=
  1013. clGetContextInfo(clCtx, CL_CONTEXT_REFERENCE_COUNT,
  1014. sizeof(cl_uint), &cluInf, &szRes);
  1015. if(wSet.APIErr)
  1016. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1017. "%s Reference count: Undefined! "
  1018. "clGetContextInfo returned oclerr %s(%d)",
  1019. pcCtx, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1020. else
  1021. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1022. "%s Reference count: %u", pcCtx, (uint32_t)cluInf);
  1023. _ghf_logWS_Msg(wSet, pcLogMsg);
  1024. }
  1025. #endif /* CL_CONTEXT_REFERENCE_COUNT */
  1026. #ifdef CL_CONTEXT_NUM_DEVICES
  1027. { /* number of devices */
  1028. wSet.APIErr=
  1029. clGetContextInfo(clCtx, CL_CONTEXT_NUM_DEVICES,
  1030. sizeof(cl_uint), &cluInf, &szRes);
  1031. if(wSet.APIErr) {
  1032. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1033. "%s Number of devices: Undefined! "
  1034. "clGetContextInfo returned oclerr %s(%d)",
  1035. pcCtx, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1036. _ghf_logWS_Msg(wSet, pcLogMsg);
  1037. } else
  1038. if(LogLevel>=_GHE_LOG_ALL) {
  1039. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1040. "%s Number of devices: %u", pcCtx, (uint32_t)cluInf);
  1041. _ghf_logWS_Msg(wSet, pcLogMsg);
  1042. }
  1043. }
  1044. #endif /* CL_CONTEXT_NUM_DEVICES */
  1045. #ifdef CL_CONTEXT_DEVICES
  1046. if(LogLevel>=_GHE_LOG_KEY_PARS) { /* Devices in context */
  1047. cl_device_id* pclDev=NULL;
  1048. pclDev=malloc(sizeof(cl_device_id)*cluInf);
  1049. if(pclDev) {
  1050. wSet.APIErr=
  1051. clGetContextInfo(clCtx, CL_CONTEXT_DEVICES,
  1052. sizeof(cl_device_id)*cluInf, pclDev, &szRes);
  1053. if(wSet.APIErr)
  1054. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1055. "%s Device ID(s): Undefined! "
  1056. "clGetContextInfo returned oclerr %s(%d)",
  1057. pcCtx, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1058. else {
  1059. cl_uint i=0u;
  1060. char pcVal[24]="\0";
  1061. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1062. "%s Device ID(s):", pcCtx);
  1063. for(i=0u; i<cluInf; i++) {
  1064. snprintf(pcVal,24ul, " 0x%lx", (uint64_t)pclDev[i]);
  1065. strncat(pcLogMsg, pcVal,
  1066. _GHM_MAXLEN_OF_LOGMSG-strlen(pcLogMsg));
  1067. }
  1068. _ghf_logWS_Msg(wSet, pcLogMsg);
  1069. {
  1070. char pcTmpPrefix[64]="\0";
  1071. snprintf(pcTmpPrefix, 64ul, "%s ", pcCtx);
  1072. for(i=0u; i<cluInf; i++)
  1073. _ghf_logWS_DevInfoShort(wSet, pclDev[i], pcTmpPrefix);
  1074. }
  1075. }
  1076. if(pclDev) { free(pclDev); pclDev=NULL; }
  1077. } else {
  1078. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1079. "%s Device ID(s): %s", pcCtx,
  1080. "Undefined! Host memory allocation failed");
  1081. _ghf_logWS_Msg(wSet, pcLogMsg);
  1082. }
  1083. }
  1084. #endif /* CL_CONTEXT_DEVICES */
  1085. #ifdef CL_CONTEXT_PROPERTIES
  1086. if(LogLevel>=_GHE_LOG_ALL) { /* context properties */
  1087. wSet.APIErr=
  1088. clGetContextInfo(clCtx, CL_CONTEXT_PROPERTIES, 0ul, NULL, &szRes);
  1089. if(wSet.APIErr) {
  1090. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1091. "%s Context properties: Undefined! "
  1092. "clGetContextInfo returned oclerr %s(%d)",
  1093. pcCtx, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1094. _ghf_logWS_Msg(wSet, pcLogMsg);
  1095. } else {
  1096. cl_context_properties* pclCtxProps=NULL;
  1097. pclCtxProps=malloc(szRes);
  1098. if(!pclCtxProps) return(_GHM_HOST_MEMALLOC_ERROR);
  1099. wSet.APIErr=
  1100. clGetContextInfo(clCtx, CL_CONTEXT_PROPERTIES,
  1101. szRes, pclCtxProps, &szRes);
  1102. if(!wSet.APIErr) {
  1103. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1104. "%s Context properties:", pcCtx);
  1105. _ghf_logWS_Msg(wSet, pcLogMsg);
  1106. {
  1107. uint64_t i=0ul;
  1108. while(pclCtxProps[i]!=CL_CONTEXT_PLATFORM &&
  1109. pclCtxProps[i+2] ) i+=2;
  1110. if(pclCtxProps[i]==CL_CONTEXT_PLATFORM) {
  1111. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1112. "%s Platform: 0x%04lx",
  1113. pcCtx, __GHM_U64STRIPTO2B(pclCtxProps[i+1]));
  1114. _ghf_logWS_Msg(wSet, pcLogMsg);
  1115. {
  1116. char pcTmpPrefix[64]="\0";
  1117. snprintf(pcTmpPrefix, 64ul, "%s ", pcCtx);
  1118. _ghf_logWS_PlatfInfo(wSet,
  1119. (cl_platform_id)pclCtxProps[i+1],pcTmpPrefix);
  1120. }
  1121. }
  1122. }
  1123. {
  1124. uint64_t i=0ul;
  1125. while(pclCtxProps[i]!=CL_CONTEXT_INTEROP_USER_SYNC &&
  1126. pclCtxProps[i+2] ) i+=2;
  1127. if(pclCtxProps[i]==CL_CONTEXT_INTEROP_USER_SYNC) {
  1128. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1129. "%s Is user responsible for sync: %s",
  1130. pcCtx,((cl_bool) pclCtxProps[i+1])?"Yes":"No");
  1131. _ghf_logWS_Msg(wSet, pcLogMsg);
  1132. } else {
  1133. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1134. "%s Is user responsible for sync: "
  1135. "Undefined (presumable No)", pcCtx);
  1136. _ghf_logWS_Msg(wSet, pcLogMsg);
  1137. }
  1138. }
  1139. } else {
  1140. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1141. "%s Context properties:", pcCtx);
  1142. _ghf_logWS_Msg(wSet, pcLogMsg);
  1143. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1144. "%s Platform: Undefined", pcCtx);
  1145. _ghf_logWS_Msg(wSet, pcLogMsg);
  1146. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1147. "%s Is user responsible for sync: "
  1148. "Undefined (presumable No)", pcCtx);
  1149. _ghf_logWS_Msg(wSet, pcLogMsg);
  1150. }
  1151. if(pclCtxProps) { free(pclCtxProps); pclCtxProps=NULL; }
  1152. }
  1153. }
  1154. #endif /* CL_CONTEXT_PROPERTIES */
  1155. return(_GHM_OK);
  1156. }
  1157. int32_t _ghf_logWS_BuildInfo( _GHT_WRKSET wSet,
  1158. const cl_program clProgram,
  1159. const cl_device_id clDev,
  1160. const _GHE_LOGLVL LogLevel,
  1161. const _GHE_BUILD_LOG_MODE BuildLogMode) {
  1162. /* TODO: make ifdefs */
  1163. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG],
  1164. pcProgram[64];
  1165. cl_build_status clStatus=0;
  1166. snprintf(pcProgram, sizeof(pcProgram),
  1167. "program_0x%04lx |", __GHM_U64STRIPTO2B(clProgram));
  1168. { /* options */
  1169. char* pcVal=NULL;
  1170. size_t szRes=0ul;
  1171. wSet.APIErr=
  1172. clGetProgramBuildInfo(clProgram, clDev,
  1173. CL_PROGRAM_BUILD_OPTIONS, 0ul, NULL, &szRes);
  1174. if(wSet.APIErr)
  1175. snprintf(pcLogMsg,_GHM_MAXLEN_OF_LOGMSG,
  1176. "%s Build options: Undefined! "
  1177. "clGetDeviceInfo returned oclerr %s(%d)",
  1178. pcProgram, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1179. else {
  1180. pcVal=malloc(szRes);
  1181. if(pcVal) {
  1182. wSet.APIErr=
  1183. clGetProgramBuildInfo(clProgram, clDev,
  1184. CL_PROGRAM_BUILD_OPTIONS,
  1185. szRes, pcVal, &szRes);
  1186. if(wSet.APIErr)
  1187. snprintf(pcLogMsg,_GHM_MAXLEN_OF_LOGMSG,
  1188. "%s Build options: Undefined! "
  1189. "clGetDeviceInfo returned oclerr %s(%d)",
  1190. pcProgram,
  1191. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1192. else {
  1193. pcVal[szRes-1]='\0';
  1194. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1195. "%s Build options: %s", pcProgram, pcVal);
  1196. }
  1197. if(pcVal) { free(pcVal); pcVal=NULL; }
  1198. } else
  1199. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1200. "%s Build options: Undefined! "
  1201. "Host memory allocation failed", pcProgram);
  1202. }
  1203. _ghf_logWS_Msg(wSet, pcLogMsg);
  1204. }
  1205. { /* status */
  1206. size_t szRes=0ul;
  1207. char pcVal[_GHM_MAXLEN_OF_LOGMSG];
  1208. wSet.APIErr=
  1209. clGetProgramBuildInfo(clProgram, clDev,
  1210. CL_PROGRAM_BUILD_STATUS,
  1211. sizeof(cl_build_status), &clStatus, &szRes);
  1212. if(wSet.APIErr)
  1213. snprintf(pcVal, _GHM_MAXLEN_OF_LOGMSG,
  1214. "Undefined! clGetProgramBuildInfo returned oclerr %s(%d)",
  1215. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1216. else
  1217. switch(clStatus) {
  1218. case 0: strncpy(pcVal,"Success",_GHM_MAXLEN_OF_LOGMSG); break;
  1219. case -1: strncpy(pcVal,"None", _GHM_MAXLEN_OF_LOGMSG); break;
  1220. case -2: strncpy(pcVal,"Error", _GHM_MAXLEN_OF_LOGMSG); break;
  1221. case -3:
  1222. strncpy(pcVal,"In progress",_GHM_MAXLEN_OF_LOGMSG);
  1223. break;
  1224. default: strncpy(pcVal,"Unknown", _GHM_MAXLEN_OF_LOGMSG);
  1225. }
  1226. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1227. "%s Build status: %s", pcProgram, pcVal);
  1228. _ghf_logWS_Msg(wSet, pcLogMsg);
  1229. }
  1230. if(LogLevel>=_GHE_LOG_KEY_PARS) { /* binary type */
  1231. cl_program_binary_type clBinType=0u;
  1232. size_t szRes=0ul;
  1233. char pcVal[_GHM_MAXLEN_OF_LOGMSG]="\0";
  1234. wSet.APIErr=
  1235. clGetProgramBuildInfo(clProgram, clDev, CL_PROGRAM_BINARY_TYPE,
  1236. sizeof(cl_program_binary_type),
  1237. &clBinType, &szRes);
  1238. if(wSet.APIErr)
  1239. snprintf(pcVal, _GHM_MAXLEN_OF_LOGMSG,
  1240. "Undefined! clGetProgramBuildInfo returned oclerr %s(%d)",
  1241. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1242. else {
  1243. if(clBinType==0)
  1244. strncat(pcVal, "none ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcVal));
  1245. if(((clBinType>>1)%2))
  1246. strncat(pcVal, "object ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcVal));
  1247. if(((clBinType>>2)%2))
  1248. strncat(pcVal, "library ", _GHM_MAXLEN_OF_LOGMSG-strlen(pcVal));
  1249. if(((clBinType>>3)%2))
  1250. strncat(pcVal, "executable ",
  1251. _GHM_MAXLEN_OF_LOGMSG-strlen(pcVal));
  1252. }
  1253. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1254. "%s Binary type: %s", pcProgram, pcVal);
  1255. _ghf_logWS_Msg(wSet, pcLogMsg);
  1256. }
  1257. { /* log */
  1258. char* pcVal=NULL;
  1259. size_t szRes=0ul;
  1260. wSet.APIErr=
  1261. clGetProgramBuildInfo(clProgram, clDev,
  1262. CL_PROGRAM_BUILD_LOG, 0ul, NULL, &szRes);
  1263. if(wSet.APIErr) {
  1264. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1265. "%s Build Log: Undefined! "
  1266. "clGetDeviceInfo returned oclerr %s(%d)",
  1267. pcProgram, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1268. _ghf_logWS_Msg(wSet, pcLogMsg);
  1269. } else {
  1270. pcVal=malloc(szRes);
  1271. if(!pcVal) {
  1272. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1273. "%s Build Log: Undefined! "
  1274. "Host memory allocation failed", pcProgram);
  1275. _ghf_logWS_Msg(wSet, pcLogMsg);
  1276. } else {
  1277. wSet.APIErr=
  1278. clGetProgramBuildInfo(clProgram, clDev,
  1279. CL_PROGRAM_BUILD_LOG,
  1280. szRes, pcVal, &szRes);
  1281. if(wSet.APIErr) {
  1282. snprintf(pcLogMsg,_GHM_MAXLEN_OF_LOGMSG,
  1283. "%s Build Log: Undefined! "
  1284. "clGetDeviceInfo returned oclerr %s(%d)",
  1285. pcProgram,
  1286. _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr);
  1287. _ghf_logWS_Msg(wSet, pcLogMsg);
  1288. } else {
  1289. if(clStatus || BuildLogMode) {
  1290. pcVal[szRes-1]='\0';
  1291. _ghf_logWS_Hdr(wSet, "Build Log:");
  1292. _ghf_logWS_Raw(wSet, pcVal);
  1293. _ghf_logWS_Hdr(wSet, "End of build log");
  1294. }
  1295. }
  1296. if(pcVal) { free(pcVal); pcVal=NULL; }
  1297. }
  1298. }
  1299. }
  1300. return(_GHM_OK);
  1301. }
  1302. int32_t _ghf_logWS_KerInfo(_GHT_WRKSET wSet, const cl_kernel clKer) {
  1303. /**/
  1304. #define __LOGAPIERR_RET(___LOGERR_ARG) \
  1305. { \
  1306. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG]; \
  1307. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG, \
  1308. "kernel Undefined! clGetKernelInfo/%s returned oclerr %s(%d)", \
  1309. ___LOGERR_ARG, _ghf_CLAPIErrString(wSet.APIErr), wSet.APIErr); \
  1310. _ghf_logWS_Msg(wSet,pcLogMsg); \
  1311. return(_GHM_OK); \
  1312. }
  1313. /**/
  1314. /* TODO: make ifdefs */
  1315. char *pcKerName=NULL,
  1316. *pcKerAttrs=NULL;
  1317. size_t szRes=0ul;
  1318. cl_uint cluNofArgs=0u,
  1319. cluRefCnt=0u;
  1320. cl_context clCtx=NULL;
  1321. cl_program clPrg=NULL;
  1322. wSet.APIErr=clGetKernelInfo(clKer,CL_KERNEL_FUNCTION_NAME,0ul,NULL,&szRes);
  1323. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_FUNCTION_NAME")
  1324. pcKerName=malloc(szRes);
  1325. if(!pcKerName) {
  1326. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG];
  1327. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1328. "kernel Undefined! Host memory allocation failed");
  1329. _ghf_logWS_Msg(wSet,pcLogMsg); return(_GHM_OK);
  1330. }
  1331. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_FUNCTION_NAME,
  1332. szRes, pcKerName, &szRes);
  1333. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_FUNCTION_NAME")
  1334. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_NUM_ARGS,
  1335. sizeof(cl_uint), &cluNofArgs, &szRes);
  1336. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_NUM_ARGS")
  1337. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_REFERENCE_COUNT,
  1338. sizeof(cl_uint), &cluRefCnt, &szRes);
  1339. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_REFERENCE_COUNT")
  1340. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_CONTEXT,
  1341. sizeof(cl_context), &clCtx, &szRes);
  1342. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_CONTEXT")
  1343. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_PROGRAM,
  1344. sizeof(cl_program), &clPrg, &szRes);
  1345. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_PROGRAM")
  1346. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_ATTRIBUTES, 0ul, NULL, &szRes);
  1347. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_ATTRIBUTES")
  1348. pcKerAttrs=malloc(szRes);
  1349. if(!pcKerAttrs) {
  1350. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG];
  1351. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1352. "kernel Undefined! Host memory allocation failed");
  1353. _ghf_logWS_Msg(wSet,pcLogMsg); return(_GHM_OK);
  1354. }
  1355. wSet.APIErr=clGetKernelInfo(clKer, CL_KERNEL_ATTRIBUTES,
  1356. szRes, pcKerAttrs, &szRes);
  1357. if(wSet.APIErr) __LOGAPIERR_RET("CL_KERNEL_ATTRIBUTES")
  1358. {
  1359. char pcLogMsg[_GHM_MAXLEN_OF_LOGMSG];
  1360. snprintf(pcLogMsg, _GHM_MAXLEN_OF_LOGMSG,
  1361. "kernel %s args:%u refcnt:%u ctx:0x%04lx "
  1362. "prog:0x%04lx attrs:\"%s\"",
  1363. pcKerName, cluNofArgs, cluRefCnt,
  1364. __GHM_U64STRIPTO2B(clCtx),
  1365. __GHM_U64STRIPTO2B(clPrg), pcKerAttrs);
  1366. _ghf_logWS_Msg(wSet,pcLogMsg);
  1367. }
  1368. if(pcKerAttrs) { free(pcKerAttrs); pcKerAttrs=NULL; }
  1369. if(pcKerName) { free(pcKerName); pcKerName=NULL; }
  1370. return(_GHM_OK);
  1371. /**/
  1372. #undef __LOGAPIERR_RET
  1373. /**/
  1374. }