convert.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. #include "convert.hpp"
  2. #include "dequantize.hpp"
  3. #include "presets.hpp"
  4. template <int qk, int qr, dequantize_kernel_t dequantize_kernel, typename dst_t>
  5. static void dequantize_block(const void * __restrict__ vx, dst_t * __restrict__ y, const int64_t k,
  6. const sycl::nd_item<3> &item_ct1) {
  7. const int64_t i = 2 * (item_ct1.get_local_range(2) * item_ct1.get_group(2) +
  8. item_ct1.get_local_id(2));
  9. if (i >= k) {
  10. return;
  11. }
  12. const int64_t ib = i/qk; // block index
  13. const int64_t iqs = (i%qk)/qr; // quant index
  14. const int64_t iybs = i - i%qk; // y block start index
  15. const int64_t y_offset = qr == 1 ? 1 : qk/2;
  16. // dequantize
  17. dfloat2 v;
  18. dequantize_kernel(vx, ib, iqs, v);
  19. y[iybs + iqs + 0] = v.x();
  20. y[iybs + iqs + y_offset] = v.y();
  21. }
  22. template <int qk, int qr, dequantize_kernel_t dequantize_kernel, typename dst_t>
  23. static void dequantize_block_sycl(const void *__restrict__ vx,
  24. dst_t *__restrict__ y, const int64_t k,
  25. dpct::queue_ptr stream) {
  26. const int64_t num_blocks = (k + 2*SYCL_DEQUANTIZE_BLOCK_SIZE - 1) / (2*SYCL_DEQUANTIZE_BLOCK_SIZE);
  27. {
  28. dpct::has_capability_or_fail(stream->get_device(),
  29. {sycl::aspect::fp16});
  30. stream->parallel_for(
  31. sycl::nd_range<3>(
  32. sycl::range<3>(1, 1, num_blocks) *
  33. sycl::range<3>(1, 1, SYCL_DEQUANTIZE_BLOCK_SIZE),
  34. sycl::range<3>(1, 1, SYCL_DEQUANTIZE_BLOCK_SIZE)),
  35. [=](sycl::nd_item<3> item_ct1) {
  36. dequantize_block<qk, qr, dequantize_kernel>(vx, y, k, item_ct1);
  37. });
  38. }
  39. }
  40. template <typename dst_t>
  41. static void dequantize_row_q2_K_sycl(const void *vx, dst_t *y, const int64_t k,
  42. dpct::queue_ptr stream) {
  43. const int64_t nb = k / QK_K;
  44. #if QK_K == 256
  45. {
  46. dpct::has_capability_or_fail(stream->get_device(),
  47. {sycl::aspect::fp16});
  48. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  49. sycl::range<3>(1, 1, 64),
  50. sycl::range<3>(1, 1, 64)),
  51. [=](sycl::nd_item<3> item_ct1) {
  52. dequantize_block_q2_K(vx, y, item_ct1);
  53. });
  54. }
  55. #else
  56. {
  57. dpct::has_capability_or_fail(stream->get_device(),
  58. {sycl::aspect::fp16});
  59. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  60. sycl::range<3>(1, 1, 32),
  61. sycl::range<3>(1, 1, 32)),
  62. [=](sycl::nd_item<3> item_ct1) {
  63. dequantize_block_q2_K(vx, y, item_ct1);
  64. });
  65. }
  66. #endif
  67. }
  68. template <typename dst_t>
  69. static void dequantize_row_q3_K_sycl(const void *vx, dst_t *y, const int64_t k,
  70. dpct::queue_ptr stream) {
  71. const int64_t nb = k / QK_K;
  72. #if QK_K == 256
  73. {
  74. dpct::has_capability_or_fail(stream->get_device(),
  75. {sycl::aspect::fp16});
  76. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  77. sycl::range<3>(1, 1, 64),
  78. sycl::range<3>(1, 1, 64)),
  79. [=](sycl::nd_item<3> item_ct1) {
  80. dequantize_block_q3_K(vx, y, item_ct1);
  81. });
  82. }
  83. #else
  84. {
  85. dpct::has_capability_or_fail(stream->get_device(),
  86. {sycl::aspect::fp16});
  87. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  88. sycl::range<3>(1, 1, 32),
  89. sycl::range<3>(1, 1, 32)),
  90. [=](sycl::nd_item<3> item_ct1) {
  91. dequantize_block_q3_K(vx, y, item_ct1);
  92. });
  93. }
  94. #endif
  95. }
  96. template <typename dst_t>
  97. static void dequantize_row_q4_0_sycl(const void *vx, dst_t *y, const int64_t k,
  98. dpct::queue_ptr stream) {
  99. const int64_t nb32 = k / 32;
  100. const int64_t nb = (k + 255) / 256;
  101. {
  102. dpct::has_capability_or_fail(stream->get_device(),
  103. {sycl::aspect::fp16});
  104. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  105. sycl::range<3>(1, 1, 32),
  106. sycl::range<3>(1, 1, 32)),
  107. [=](sycl::nd_item<3> item_ct1) {
  108. dequantize_block_q4_0(vx, y, nb32, item_ct1);
  109. });
  110. }
  111. }
  112. template <typename dst_t>
  113. static void dequantize_row_q4_1_sycl(const void *vx, dst_t *y, const int64_t k,
  114. dpct::queue_ptr stream) {
  115. const int64_t nb32 = k / 32;
  116. const int64_t nb = (k + 255) / 256;
  117. {
  118. dpct::has_capability_or_fail(stream->get_device(),
  119. {sycl::aspect::fp16});
  120. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  121. sycl::range<3>(1, 1, 32),
  122. sycl::range<3>(1, 1, 32)),
  123. [=](sycl::nd_item<3> item_ct1) {
  124. dequantize_block_q4_1(vx, y, nb32, item_ct1);
  125. });
  126. }
  127. }
  128. template <typename dst_t>
  129. static void dequantize_row_q4_K_sycl(const void *vx, dst_t *y, const int64_t k,
  130. dpct::queue_ptr stream) {
  131. const int64_t nb = k / QK_K;
  132. {
  133. dpct::has_capability_or_fail(stream->get_device(),
  134. {sycl::aspect::fp16});
  135. stream->submit([&](sycl::handler &cgh) {
  136. sycl::local_accessor<uint8_t, 1> scale_local_acc(sycl::range<1>(12), cgh);
  137. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  138. sycl::range<3>(1, 1, 32),
  139. sycl::range<3>(1, 1, 32)),
  140. [=](sycl::nd_item<3> item_ct1) {
  141. dequantize_block_q4_K(vx, y, get_pointer(scale_local_acc), item_ct1);
  142. });
  143. });
  144. }
  145. }
  146. template <typename dst_t>
  147. static void dequantize_row_q5_K_sycl(const void *vx, dst_t *y, const int64_t k,
  148. dpct::queue_ptr stream) {
  149. const int64_t nb = k / QK_K;
  150. #if QK_K == 256
  151. {
  152. dpct::has_capability_or_fail(stream->get_device(),
  153. {sycl::aspect::fp16});
  154. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  155. sycl::range<3>(1, 1, 64),
  156. sycl::range<3>(1, 1, 64)),
  157. [=](sycl::nd_item<3> item_ct1) {
  158. dequantize_block_q5_K(vx, y, item_ct1);
  159. });
  160. }
  161. #else
  162. {
  163. dpct::has_capability_or_fail(stream->get_device(),
  164. {sycl::aspect::fp16});
  165. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  166. sycl::range<3>(1, 1, 32),
  167. sycl::range<3>(1, 1, 32)),
  168. [=](sycl::nd_item<3> item_ct1) {
  169. dequantize_block_q5_K(vx, y, item_ct1);
  170. });
  171. }
  172. #endif
  173. }
  174. template <typename dst_t>
  175. static void dequantize_row_q6_K_sycl(const void *vx, dst_t *y, const int64_t k,
  176. dpct::queue_ptr stream) {
  177. const int64_t nb = k / QK_K;
  178. #if QK_K == 256
  179. {
  180. dpct::has_capability_or_fail(stream->get_device(),
  181. {sycl::aspect::fp16});
  182. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  183. sycl::range<3>(1, 1, 64),
  184. sycl::range<3>(1, 1, 64)),
  185. [=](sycl::nd_item<3> item_ct1) {
  186. dequantize_block_q6_K(vx, y, item_ct1);
  187. });
  188. }
  189. #else
  190. {
  191. dpct::has_capability_or_fail(stream->get_device(),
  192. {sycl::aspect::fp16});
  193. stream->parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  194. sycl::range<3>(1, 1, 32),
  195. sycl::range<3>(1, 1, 32)),
  196. [=](sycl::nd_item<3> item_ct1) {
  197. dequantize_block_q6_K(vx, y, item_ct1);
  198. });
  199. }
  200. #endif
  201. }
  202. template <typename dst_t>
  203. static void dequantize_row_iq1_s_sycl(const void *vx, dst_t *y, const int64_t k,
  204. dpct::queue_ptr stream) {
  205. const int64_t nb = k / QK_K;
  206. {
  207. dpct::has_capability_or_fail(stream->get_device(),
  208. {sycl::aspect::fp16});
  209. stream->submit([&](sycl::handler &cgh) {
  210. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  211. sycl::range<3>(1, 1, 32),
  212. sycl::range<3>(1, 1, 32)),
  213. [=](sycl::nd_item<3> item_ct1) {
  214. dequantize_block_iq1_s(
  215. vx, y, item_ct1, iq1s_grid_gpu
  216. );
  217. });
  218. });
  219. }
  220. }
  221. template <typename dst_t>
  222. static void dequantize_row_iq1_m_sycl(const void *vx, dst_t *y, const int64_t k,
  223. dpct::queue_ptr stream) {
  224. const int64_t nb = k / QK_K;
  225. {
  226. dpct::has_capability_or_fail(stream->get_device(),
  227. {sycl::aspect::fp16});
  228. stream->submit([&](sycl::handler &cgh) {
  229. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  230. sycl::range<3>(1, 1, 32),
  231. sycl::range<3>(1, 1, 32)),
  232. [=](sycl::nd_item<3> item_ct1) {
  233. dequantize_block_iq1_m(
  234. vx, y, item_ct1, iq1s_grid_gpu
  235. );
  236. });
  237. });
  238. }
  239. }
  240. template <typename dst_t>
  241. static void dequantize_row_iq2_xxs_sycl(const void *vx, dst_t *y, const int64_t k,
  242. dpct::queue_ptr stream) {
  243. const int64_t nb = k / QK_K;
  244. {
  245. dpct::has_capability_or_fail(stream->get_device(),
  246. {sycl::aspect::fp16});
  247. stream->submit([&](sycl::handler &cgh) {
  248. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  249. sycl::range<3>(1, 1, 32),
  250. sycl::range<3>(1, 1, 32)),
  251. [=](sycl::nd_item<3> item_ct1) {
  252. dequantize_block_iq2_xxs(
  253. vx, y, item_ct1, iq2xxs_grid,
  254. ksigns_iq2xs, kmask_iq2xs);
  255. });
  256. });
  257. }
  258. }
  259. template <typename dst_t>
  260. static void dequantize_row_iq2_xs_sycl(const void *vx, dst_t *y, const int64_t k,
  261. dpct::queue_ptr stream) {
  262. const int64_t nb = k / QK_K;
  263. {
  264. dpct::has_capability_or_fail(stream->get_device(),
  265. {sycl::aspect::fp16});
  266. stream->submit([&](sycl::handler &cgh) {
  267. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  268. sycl::range<3>(1, 1, 32),
  269. sycl::range<3>(1, 1, 32)),
  270. [=](sycl::nd_item<3> item_ct1) {
  271. dequantize_block_iq2_xs(
  272. vx, y, item_ct1, iq2xs_grid,
  273. ksigns_iq2xs, kmask_iq2xs);
  274. });
  275. });
  276. }
  277. }
  278. template <typename dst_t>
  279. static void dequantize_row_iq2_s_sycl(const void *vx, dst_t *y, const int64_t k,
  280. dpct::queue_ptr stream) {
  281. const int64_t nb = k / QK_K;
  282. {
  283. dpct::has_capability_or_fail(stream->get_device(),
  284. {sycl::aspect::fp16});
  285. stream->submit([&](sycl::handler &cgh) {
  286. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  287. sycl::range<3>(1, 1, 32),
  288. sycl::range<3>(1, 1, 32)),
  289. [=](sycl::nd_item<3> item_ct1) {
  290. dequantize_block_iq2_s(vx, y, item_ct1);
  291. });
  292. });
  293. }
  294. }
  295. template <typename dst_t>
  296. static void dequantize_row_iq3_xxs_sycl(const void *vx, dst_t *y, const int64_t k,
  297. dpct::queue_ptr stream) {
  298. const int64_t nb = k / QK_K;
  299. {
  300. dpct::has_capability_or_fail(stream->get_device(),
  301. {sycl::aspect::fp16});
  302. stream->submit([&](sycl::handler &cgh) {
  303. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  304. sycl::range<3>(1, 1, 32),
  305. sycl::range<3>(1, 1, 32)),
  306. [=](sycl::nd_item<3> item_ct1) {
  307. dequantize_block_iq3_xxs(
  308. vx, y, item_ct1, iq3xxs_grid,
  309. ksigns_iq2xs, kmask_iq2xs);
  310. });
  311. });
  312. }
  313. }
  314. template <typename dst_t>
  315. static void dequantize_row_iq3_s_sycl(const void *vx, dst_t *y, const int64_t k,
  316. dpct::queue_ptr stream) {
  317. const int64_t nb = k / QK_K;
  318. {
  319. dpct::has_capability_or_fail(stream->get_device(),
  320. {sycl::aspect::fp16});
  321. stream->submit([&](sycl::handler &cgh) {
  322. cgh.parallel_for(sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  323. sycl::range<3>(1, 1, 32),
  324. sycl::range<3>(1, 1, 32)),
  325. [=](sycl::nd_item<3> item_ct1) {
  326. dequantize_block_iq3_s(
  327. vx, y, item_ct1, kmask_iq2xs, iq3s_grid);
  328. });
  329. });
  330. }
  331. }
  332. template <typename dst_t>
  333. static void dequantize_row_iq4_xs_sycl(const void *vx, dst_t *y, const int64_t k,
  334. dpct::queue_ptr stream) {
  335. const int64_t nb = (k + QK_K - 1) / QK_K;
  336. #if QK_K == 64
  337. dequantize_row_iq4_nl_sycl(vx, y, k, stream);
  338. #else
  339. {
  340. dpct::has_capability_or_fail(stream->get_device(),
  341. {sycl::aspect::fp16});
  342. stream->submit([&](sycl::handler &cgh) {
  343. cgh.parallel_for(
  344. sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  345. sycl::range<3>(1, 1, 32),
  346. sycl::range<3>(1, 1, 32)),
  347. [=](sycl::nd_item<3> item_ct1) {
  348. dequantize_block_iq4_xs(vx, y, item_ct1);
  349. });
  350. });
  351. }
  352. #endif
  353. }
  354. template <typename dst_t>
  355. static void dequantize_row_iq4_nl_sycl(const void *vx, dst_t *y, const int64_t k,
  356. dpct::queue_ptr stream) {
  357. const int64_t nb = (k + QK_K - 1) / QK_K;
  358. {
  359. dpct::has_capability_or_fail(stream->get_device(),
  360. {sycl::aspect::fp16});
  361. stream->submit([&](sycl::handler &cgh) {
  362. cgh.parallel_for(
  363. sycl::nd_range<3>(sycl::range<3>(1, 1, nb) *
  364. sycl::range<3>(1, 1, 32),
  365. sycl::range<3>(1, 1, 32)),
  366. [=](sycl::nd_item<3> item_ct1) {
  367. dequantize_block_iq4_nl(vx, y, item_ct1);
  368. });
  369. });
  370. }
  371. }
  372. template <typename src_t, typename dst_t>
  373. static void convert_unary(const void * __restrict__ vx, dst_t * __restrict__ y, const int64_t k,
  374. const sycl::nd_item<3> &item_ct1) {
  375. const int64_t work_group_size = item_ct1.get_local_range(2);
  376. const int64_t global_id = item_ct1.get_local_id(2) + work_group_size * item_ct1.get_group(2);
  377. // make each work-item deal with more elements since sycl global range can not exceed max int
  378. const src_t * x = (src_t *) vx;
  379. for (int64_t i = global_id; i < k; i += work_group_size * item_ct1.get_group_range(2)) {
  380. y[i] = x[i];
  381. }
  382. }
  383. template <typename src_t, typename dst_t>
  384. static void convert_unary_sycl(const void *__restrict__ vx,
  385. dst_t *__restrict__ y, const int64_t k,
  386. dpct::queue_ptr stream) {
  387. const int64_t num_blocks = (k + SYCL_DEQUANTIZE_BLOCK_SIZE - 1) / SYCL_DEQUANTIZE_BLOCK_SIZE;
  388. // decrease global range when it exceeds the max int
  389. int64_t local_size = downsample_sycl_global_range(num_blocks, SYCL_DEQUANTIZE_BLOCK_SIZE);
  390. sycl::range<3> block_nums(1, 1, num_blocks);
  391. sycl::range<3> local_range(1, 1, local_size);
  392. {
  393. dpct::has_capability_or_fail(stream->get_device(),
  394. {sycl::aspect::fp16});
  395. stream->parallel_for(
  396. sycl::nd_range<3>(block_nums * local_range, local_range),
  397. [=](sycl::nd_item<3> item_ct1) {
  398. convert_unary<src_t>(vx, y, k, item_ct1);
  399. });
  400. }
  401. }
  402. to_fp16_sycl_t ggml_get_to_fp16_sycl(ggml_type type) {
  403. switch (type) {
  404. case GGML_TYPE_Q4_0:
  405. return dequantize_block_sycl<QK4_0, QR4_0, dequantize_q4_0>;
  406. case GGML_TYPE_Q4_1:
  407. return dequantize_block_sycl<QK4_1, QR4_1, dequantize_q4_1>;
  408. case GGML_TYPE_Q5_0:
  409. return dequantize_block_sycl<QK5_0, QR5_0, dequantize_q5_0>;
  410. case GGML_TYPE_Q5_1:
  411. return dequantize_block_sycl<QK5_1, QR5_1, dequantize_q5_1>;
  412. case GGML_TYPE_Q8_0:
  413. return dequantize_block_sycl<QK8_0, QR8_0, dequantize_q8_0>;
  414. case GGML_TYPE_Q2_K:
  415. return dequantize_row_q2_K_sycl;
  416. case GGML_TYPE_Q3_K:
  417. return dequantize_row_q3_K_sycl;
  418. case GGML_TYPE_Q4_K:
  419. return dequantize_row_q4_K_sycl;
  420. case GGML_TYPE_Q5_K:
  421. return dequantize_row_q5_K_sycl;
  422. case GGML_TYPE_Q6_K:
  423. return dequantize_row_q6_K_sycl;
  424. case GGML_TYPE_IQ1_S:
  425. return dequantize_row_iq1_s_sycl;
  426. case GGML_TYPE_IQ1_M:
  427. return dequantize_row_iq1_m_sycl;
  428. case GGML_TYPE_IQ2_XXS:
  429. return dequantize_row_iq2_xxs_sycl;
  430. case GGML_TYPE_IQ2_XS:
  431. return dequantize_row_iq2_xs_sycl;
  432. case GGML_TYPE_IQ2_S:
  433. return dequantize_row_iq2_s_sycl;
  434. case GGML_TYPE_IQ3_XXS:
  435. return dequantize_row_iq3_xxs_sycl;
  436. case GGML_TYPE_IQ3_S:
  437. return dequantize_row_iq3_s_sycl;
  438. case GGML_TYPE_IQ4_XS:
  439. return dequantize_row_iq4_xs_sycl;
  440. case GGML_TYPE_IQ4_NL:
  441. return dequantize_row_iq4_nl_sycl;
  442. case GGML_TYPE_F32:
  443. return convert_unary_sycl<float>;
  444. default:
  445. return nullptr;
  446. }
  447. }
  448. to_fp32_sycl_t ggml_get_to_fp32_sycl(ggml_type type) {
  449. switch (type) {
  450. case GGML_TYPE_Q4_0:
  451. return dequantize_row_q4_0_sycl;
  452. case GGML_TYPE_Q4_1:
  453. return dequantize_row_q4_1_sycl;
  454. case GGML_TYPE_Q5_0:
  455. return dequantize_block_sycl<QK5_0, QR5_0, dequantize_q5_0>;
  456. case GGML_TYPE_Q5_1:
  457. return dequantize_block_sycl<QK5_1, QR5_1, dequantize_q5_1>;
  458. case GGML_TYPE_Q8_0:
  459. return dequantize_block_sycl<QK8_0, QR8_0, dequantize_q8_0>;
  460. case GGML_TYPE_Q2_K:
  461. return dequantize_row_q2_K_sycl;
  462. case GGML_TYPE_Q3_K:
  463. return dequantize_row_q3_K_sycl;
  464. case GGML_TYPE_Q4_K:
  465. return dequantize_row_q4_K_sycl;
  466. case GGML_TYPE_Q5_K:
  467. return dequantize_row_q5_K_sycl;
  468. case GGML_TYPE_Q6_K:
  469. return dequantize_row_q6_K_sycl;
  470. case GGML_TYPE_IQ1_S:
  471. return dequantize_row_iq1_s_sycl;
  472. case GGML_TYPE_IQ1_M:
  473. return dequantize_row_iq1_m_sycl;
  474. case GGML_TYPE_IQ2_XXS:
  475. return dequantize_row_iq2_xxs_sycl;
  476. case GGML_TYPE_IQ2_XS:
  477. return dequantize_row_iq2_xs_sycl;
  478. case GGML_TYPE_IQ2_S:
  479. return dequantize_row_iq2_s_sycl;
  480. case GGML_TYPE_IQ3_XXS:
  481. return dequantize_row_iq3_xxs_sycl;
  482. case GGML_TYPE_IQ3_S:
  483. return dequantize_row_iq3_s_sycl;
  484. case GGML_TYPE_IQ4_XS:
  485. return dequantize_row_iq4_xs_sycl;
  486. case GGML_TYPE_IQ4_NL:
  487. return dequantize_row_iq4_nl_sycl;
  488. case GGML_TYPE_F16:
  489. return convert_unary_sycl<sycl::half>;
  490. default:
  491. return nullptr;
  492. }
  493. }