offload_omp_target.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. /*
  2. Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved.
  3. Redistribution and use in source and binary forms, with or without
  4. modification, are permitted provided that the following conditions
  5. are met:
  6. * Redistributions of source code must retain the above copyright
  7. notice, this list of conditions and the following disclaimer.
  8. * Redistributions in binary form must reproduce the above copyright
  9. notice, this list of conditions and the following disclaimer in the
  10. documentation and/or other materials provided with the distribution.
  11. * Neither the name of Intel Corporation nor the names of its
  12. contributors may be used to endorse or promote products derived
  13. from this software without specific prior written permission.
  14. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  15. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  16. LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  17. A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  18. HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  19. SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  20. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  21. DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  22. THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include <omp.h>
  27. #include "offload.h"
  28. #include "compiler_if_target.h"
  29. // OpenMP API
  30. void omp_set_default_device(int num) __GOMP_NOTHROW
  31. {
  32. }
  33. int omp_get_default_device(void) __GOMP_NOTHROW
  34. {
  35. return mic_index;
  36. }
  37. int omp_get_num_devices() __GOMP_NOTHROW
  38. {
  39. return mic_engines_total;
  40. }
  41. // OpenMP 4.5 APIs
  42. // COI supports 3-dim multiD transfers
  43. #define MAX_ARRAY_RANK 3
  44. DLL_LOCAL void omp_target_alloc_target(
  45. void *ofld_
  46. )
  47. {
  48. OFFLOAD ofld = (OFFLOAD) ofld_;
  49. VarDesc vars[2] = {0};
  50. size_t size;
  51. void* memory;
  52. vars[0].type.src = c_data;
  53. vars[0].type.dst = c_data;
  54. vars[0].direction.bits = c_parameter_in;
  55. vars[0].ptr = &size;
  56. vars[1].type.src = c_data;
  57. vars[1].type.dst = c_data;
  58. vars[1].direction.bits = c_parameter_out;
  59. vars[1].ptr = &memory;
  60. OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
  61. OFFLOAD_DEBUG_TRACE(2, "omp_target_alloc(%lld)\n", size);
  62. // We do not check for malloc returning NULL because the
  63. // specification of this API includes the possibility of failure.
  64. // The user will check the returned result
  65. memory = malloc(size);
  66. OFFLOAD_DEBUG_TRACE(2, "omp_target_alloc allocated at %p\n", memory);
  67. OFFLOAD_TARGET_LEAVE(ofld);
  68. }
  69. DLL_LOCAL void omp_target_free_target(
  70. void *ofld_
  71. )
  72. {
  73. OFFLOAD ofld = (OFFLOAD) ofld_;
  74. VarDesc vars[1] = {0};
  75. void* memory;
  76. vars[0].type.src = c_data;
  77. vars[0].type.dst = c_data;
  78. vars[0].direction.bits = c_parameter_in;
  79. vars[0].ptr = &memory;
  80. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  81. OFFLOAD_DEBUG_TRACE(2, "omp_target_free(%p)\n", memory);
  82. free(memory);
  83. OFFLOAD_DEBUG_TRACE(2, "omp_target_free freed\n");
  84. OFFLOAD_TARGET_LEAVE(ofld);
  85. }
  86. DLL_LOCAL void omp_target_memcpy_target(
  87. void *ofld_
  88. )
  89. {
  90. OFFLOAD ofld = (OFFLOAD) ofld_;
  91. VarDesc vars[3] = {0};
  92. void* dst;
  93. void* src;
  94. size_t length;
  95. vars[0].type.src = c_data;
  96. vars[0].type.dst = c_data;
  97. vars[0].direction.bits = c_parameter_in;
  98. vars[0].ptr = &dst;
  99. vars[1].type.src = c_data;
  100. vars[1].type.dst = c_data;
  101. vars[1].direction.bits = c_parameter_in;
  102. vars[1].ptr = &src;
  103. vars[2].type.src = c_data;
  104. vars[2].type.dst = c_data;
  105. vars[2].direction.bits = c_parameter_in;
  106. vars[2].ptr = &length;
  107. OFFLOAD_TARGET_ENTER(ofld, 3, vars, NULL);
  108. OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy(%p, %p, %lld)\n",
  109. dst, src, length);
  110. memcpy(dst, src, length);
  111. OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy done\n");
  112. OFFLOAD_TARGET_LEAVE(ofld);
  113. }
  114. static size_t bytesize_at_this_dimension(
  115. size_t element_size,
  116. int num_dims,
  117. const size_t* dimensions
  118. )
  119. {
  120. if (num_dims > 1) {
  121. return dimensions[1] *
  122. bytesize_at_this_dimension(
  123. element_size, num_dims-1, dimensions+1);
  124. } else {
  125. return element_size;
  126. }
  127. }
  128. static void memcpy_rect(
  129. char *dst,
  130. char *src,
  131. size_t element_size,
  132. int num_dims,
  133. const size_t *volume,
  134. const size_t *dst_offsets,
  135. const size_t *src_offsets,
  136. const size_t *dst_dimensions,
  137. const size_t *src_dimensions
  138. )
  139. {
  140. if (num_dims > 1) {
  141. int count = volume[0];
  142. int dst_index = dst_offsets[0];
  143. int src_index = src_offsets[0];
  144. size_t dst_element_size =
  145. bytesize_at_this_dimension(element_size, num_dims, dst_dimensions);
  146. size_t src_element_size =
  147. bytesize_at_this_dimension(element_size, num_dims, src_dimensions);
  148. for (; count>0; dst_index++, src_index++, count--) {
  149. memcpy_rect(dst+dst_element_size*dst_index,
  150. src+src_element_size*src_index,
  151. element_size, num_dims-1, volume+1,
  152. dst_offsets+1, src_offsets+1,
  153. dst_dimensions+1, src_dimensions+1);
  154. }
  155. } else {
  156. memcpy(dst+dst_offsets[0]*element_size,
  157. src+src_offsets[0]*element_size,
  158. element_size * volume[0]);
  159. }
  160. }
  161. DLL_LOCAL void omp_target_memcpy_rect_target(
  162. void *ofld_
  163. )
  164. {
  165. OFFLOAD ofld = (OFFLOAD) ofld_;
  166. VarDesc vars[1] = {0};
  167. struct parameters {
  168. void *dst;
  169. void *src;
  170. size_t element_size;
  171. int num_dims;
  172. size_t array_info[MAX_ARRAY_RANK*5];
  173. } parameters;
  174. vars[0].type.src = c_data;
  175. vars[0].type.dst = c_data;
  176. vars[0].direction.bits = c_parameter_in;
  177. vars[0].ptr = &parameters;
  178. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  179. OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy_rect(%p, %p, %lld, %d)\n",
  180. parameters.dst, parameters.src,
  181. parameters.element_size, parameters.num_dims);
  182. memcpy_rect(
  183. (char*)parameters.dst, (char*)parameters.src, parameters.element_size,
  184. parameters.num_dims,
  185. &parameters.array_info[0],
  186. &parameters.array_info[parameters.num_dims],
  187. &parameters.array_info[parameters.num_dims*2],
  188. &parameters.array_info[parameters.num_dims*3],
  189. &parameters.array_info[parameters.num_dims*4]);
  190. OFFLOAD_DEBUG_TRACE(2, "omp_target_memcpy_rect done\n");
  191. OFFLOAD_TARGET_LEAVE(ofld);
  192. }
  193. // End of OpenMP 4.5 APIs
  194. // OpenMP API wrappers
  195. static void omp_send_int_to_host(
  196. void *ofld_,
  197. int setting
  198. )
  199. {
  200. OFFLOAD ofld = (OFFLOAD) ofld_;
  201. VarDesc vars[1] = {0};
  202. vars[0].type.src = c_data;
  203. vars[0].type.dst = c_data;
  204. vars[0].direction.bits = c_parameter_out;
  205. vars[0].ptr = &setting;
  206. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  207. OFFLOAD_TARGET_LEAVE(ofld);
  208. }
  209. static int omp_get_int_from_host(
  210. void *ofld_
  211. )
  212. {
  213. OFFLOAD ofld = (OFFLOAD) ofld_;
  214. VarDesc vars[1] = {0};
  215. int setting;
  216. vars[0].type.src = c_data;
  217. vars[0].type.dst = c_data;
  218. vars[0].direction.bits = c_parameter_in;
  219. vars[0].ptr = &setting;
  220. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  221. OFFLOAD_TARGET_LEAVE(ofld);
  222. return setting;
  223. }
  224. DLL_LOCAL void omp_set_num_threads_lrb(
  225. void *ofld
  226. )
  227. {
  228. int num_threads;
  229. num_threads = omp_get_int_from_host(ofld);
  230. omp_set_num_threads(num_threads);
  231. }
  232. DLL_LOCAL void omp_get_max_threads_lrb(
  233. void *ofld
  234. )
  235. {
  236. int num_threads;
  237. num_threads = omp_get_max_threads();
  238. omp_send_int_to_host(ofld, num_threads);
  239. }
  240. DLL_LOCAL void omp_get_num_procs_lrb(
  241. void *ofld
  242. )
  243. {
  244. int num_procs;
  245. num_procs = omp_get_num_procs();
  246. omp_send_int_to_host(ofld, num_procs);
  247. }
  248. DLL_LOCAL void omp_set_dynamic_lrb(
  249. void *ofld
  250. )
  251. {
  252. int dynamic;
  253. dynamic = omp_get_int_from_host(ofld);
  254. omp_set_dynamic(dynamic);
  255. }
  256. DLL_LOCAL void omp_get_dynamic_lrb(
  257. void *ofld
  258. )
  259. {
  260. int dynamic;
  261. dynamic = omp_get_dynamic();
  262. omp_send_int_to_host(ofld, dynamic);
  263. }
  264. DLL_LOCAL void omp_set_nested_lrb(
  265. void *ofld
  266. )
  267. {
  268. int nested;
  269. nested = omp_get_int_from_host(ofld);
  270. omp_set_nested(nested);
  271. }
  272. DLL_LOCAL void omp_get_nested_lrb(
  273. void *ofld
  274. )
  275. {
  276. int nested;
  277. nested = omp_get_nested();
  278. omp_send_int_to_host(ofld, nested);
  279. }
  280. DLL_LOCAL void omp_set_schedule_lrb(
  281. void *ofld_
  282. )
  283. {
  284. OFFLOAD ofld = (OFFLOAD) ofld_;
  285. VarDesc vars[2] = {0};
  286. omp_sched_t kind;
  287. int modifier;
  288. vars[0].type.src = c_data;
  289. vars[0].type.dst = c_data;
  290. vars[0].direction.bits = c_parameter_in;
  291. vars[0].ptr = &kind;
  292. vars[1].type.src = c_data;
  293. vars[1].type.dst = c_data;
  294. vars[1].direction.bits = c_parameter_in;
  295. vars[1].ptr = &modifier;
  296. OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
  297. omp_set_schedule(kind, modifier);
  298. OFFLOAD_TARGET_LEAVE(ofld);
  299. }
  300. DLL_LOCAL void omp_get_schedule_lrb(
  301. void *ofld_
  302. )
  303. {
  304. OFFLOAD ofld = (OFFLOAD) ofld_;
  305. VarDesc vars[2] = {0};
  306. omp_sched_t kind;
  307. int modifier;
  308. vars[0].type.src = c_data;
  309. vars[0].type.dst = c_data;
  310. vars[0].direction.bits = c_parameter_out;
  311. vars[0].ptr = &kind;
  312. vars[1].type.src = c_data;
  313. vars[1].type.dst = c_data;
  314. vars[1].direction.bits = c_parameter_out;
  315. vars[1].ptr = &modifier;
  316. OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
  317. omp_get_schedule(&kind, &modifier);
  318. OFFLOAD_TARGET_LEAVE(ofld);
  319. }
  320. // lock API functions
  321. DLL_LOCAL void omp_init_lock_lrb(
  322. void *ofld_
  323. )
  324. {
  325. OFFLOAD ofld = (OFFLOAD) ofld_;
  326. VarDesc vars[1] = {0};
  327. omp_lock_target_t lock;
  328. vars[0].type.src = c_data;
  329. vars[0].type.dst = c_data;
  330. vars[0].direction.bits = c_parameter_out;
  331. vars[0].ptr = &lock;
  332. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  333. omp_init_lock(&lock.lock);
  334. OFFLOAD_TARGET_LEAVE(ofld);
  335. }
  336. DLL_LOCAL void omp_destroy_lock_lrb(
  337. void *ofld_
  338. )
  339. {
  340. OFFLOAD ofld = (OFFLOAD) ofld_;
  341. VarDesc vars[1] = {0};
  342. omp_lock_target_t lock;
  343. vars[0].type.src = c_data;
  344. vars[0].type.dst = c_data;
  345. vars[0].direction.bits = c_parameter_in;
  346. vars[0].ptr = &lock;
  347. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  348. omp_destroy_lock(&lock.lock);
  349. OFFLOAD_TARGET_LEAVE(ofld);
  350. }
  351. DLL_LOCAL void omp_set_lock_lrb(
  352. void *ofld_
  353. )
  354. {
  355. OFFLOAD ofld = (OFFLOAD) ofld_;
  356. VarDesc vars[1] = {0};
  357. omp_lock_target_t lock;
  358. vars[0].type.src = c_data;
  359. vars[0].type.dst = c_data;
  360. vars[0].direction.bits = c_parameter_inout;
  361. vars[0].ptr = &lock;
  362. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  363. omp_set_lock(&lock.lock);
  364. OFFLOAD_TARGET_LEAVE(ofld);
  365. }
  366. DLL_LOCAL void omp_unset_lock_lrb(
  367. void *ofld_
  368. )
  369. {
  370. OFFLOAD ofld = (OFFLOAD) ofld_;
  371. VarDesc vars[1] = {0};
  372. omp_lock_target_t lock;
  373. vars[0].type.src = c_data;
  374. vars[0].type.dst = c_data;
  375. vars[0].direction.bits = c_parameter_inout;
  376. vars[0].ptr = &lock;
  377. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  378. omp_unset_lock(&lock.lock);
  379. OFFLOAD_TARGET_LEAVE(ofld);
  380. }
  381. DLL_LOCAL void omp_test_lock_lrb(
  382. void *ofld_
  383. )
  384. {
  385. OFFLOAD ofld = (OFFLOAD) ofld_;
  386. VarDesc vars[2] = {0};
  387. omp_lock_target_t lock;
  388. int result;
  389. vars[0].type.src = c_data;
  390. vars[0].type.dst = c_data;
  391. vars[0].direction.bits = c_parameter_inout;
  392. vars[0].ptr = &lock;
  393. vars[1].type.src = c_data;
  394. vars[1].type.dst = c_data;
  395. vars[1].direction.bits = c_parameter_out;
  396. vars[1].ptr = &result;
  397. OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
  398. result = omp_test_lock(&lock.lock);
  399. OFFLOAD_TARGET_LEAVE(ofld);
  400. }
  401. // nested lock API functions
  402. DLL_LOCAL void omp_init_nest_lock_lrb(
  403. void *ofld_
  404. )
  405. {
  406. OFFLOAD ofld = (OFFLOAD) ofld_;
  407. VarDesc vars[1] = {0};
  408. omp_nest_lock_target_t lock;
  409. vars[0].type.src = c_data;
  410. vars[0].type.dst = c_data;
  411. vars[0].direction.bits = c_parameter_out;
  412. vars[0].ptr = &lock;
  413. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  414. omp_init_nest_lock(&lock.lock);
  415. OFFLOAD_TARGET_LEAVE(ofld);
  416. }
  417. DLL_LOCAL void omp_destroy_nest_lock_lrb(
  418. void *ofld_
  419. )
  420. {
  421. OFFLOAD ofld = (OFFLOAD) ofld_;
  422. VarDesc vars[1] = {0};
  423. omp_nest_lock_target_t lock;
  424. vars[0].type.src = c_data;
  425. vars[0].type.dst = c_data;
  426. vars[0].direction.bits = c_parameter_in;
  427. vars[0].ptr = &lock;
  428. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  429. omp_destroy_nest_lock(&lock.lock);
  430. OFFLOAD_TARGET_LEAVE(ofld);
  431. }
  432. DLL_LOCAL void omp_set_nest_lock_lrb(
  433. void *ofld_
  434. )
  435. {
  436. OFFLOAD ofld = (OFFLOAD) ofld_;
  437. VarDesc vars[1] = {0};
  438. omp_nest_lock_target_t lock;
  439. vars[0].type.src = c_data;
  440. vars[0].type.dst = c_data;
  441. vars[0].direction.bits = c_parameter_inout;
  442. vars[0].ptr = &lock;
  443. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  444. omp_set_nest_lock(&lock.lock);
  445. OFFLOAD_TARGET_LEAVE(ofld);
  446. }
  447. DLL_LOCAL void omp_unset_nest_lock_lrb(
  448. void *ofld_
  449. )
  450. {
  451. OFFLOAD ofld = (OFFLOAD) ofld_;
  452. VarDesc vars[1] = {0};
  453. omp_nest_lock_target_t lock;
  454. vars[0].type.src = c_data;
  455. vars[0].type.dst = c_data;
  456. vars[0].direction.bits = c_parameter_inout;
  457. vars[0].ptr = &lock;
  458. OFFLOAD_TARGET_ENTER(ofld, 1, vars, NULL);
  459. omp_unset_nest_lock(&lock.lock);
  460. OFFLOAD_TARGET_LEAVE(ofld);
  461. }
  462. DLL_LOCAL void omp_test_nest_lock_lrb(
  463. void *ofld_
  464. )
  465. {
  466. OFFLOAD ofld = (OFFLOAD) ofld_;
  467. VarDesc vars[2] = {0};
  468. omp_nest_lock_target_t lock;
  469. int result;
  470. vars[0].type.src = c_data;
  471. vars[0].type.dst = c_data;
  472. vars[0].direction.bits = c_parameter_inout;
  473. vars[0].ptr = &lock;
  474. vars[1].type.src = c_data;
  475. vars[1].type.dst = c_data;
  476. vars[1].direction.bits = c_parameter_out;
  477. vars[1].ptr = &result;
  478. OFFLOAD_TARGET_ENTER(ofld, 2, vars, NULL);
  479. result = omp_test_nest_lock(&lock.lock);
  480. OFFLOAD_TARGET_LEAVE(ofld);
  481. }
  482. // Target-side stubs for the host functions (to avoid unresolveds)
  483. // These are needed for the offloadm table
  484. void omp_set_num_threads_target(
  485. TARGET_TYPE target_type,
  486. int target_number,
  487. int num_threads
  488. )
  489. {
  490. }
  491. int omp_get_max_threads_target(
  492. TARGET_TYPE target_type,
  493. int target_number
  494. )
  495. {
  496. return 0;
  497. }
  498. int omp_get_num_procs_target(
  499. TARGET_TYPE target_type,
  500. int target_number
  501. )
  502. {
  503. return 0;
  504. }
  505. void omp_set_dynamic_target(
  506. TARGET_TYPE target_type,
  507. int target_number,
  508. int num_threads
  509. )
  510. {
  511. }
  512. int omp_get_dynamic_target(
  513. TARGET_TYPE target_type,
  514. int target_number
  515. )
  516. {
  517. return 0;
  518. }
  519. void omp_set_nested_target(
  520. TARGET_TYPE target_type,
  521. int target_number,
  522. int num_threads
  523. )
  524. {
  525. }
  526. int omp_get_nested_target(
  527. TARGET_TYPE target_type,
  528. int target_number
  529. )
  530. {
  531. return 0;
  532. }
  533. void omp_set_schedule_target(
  534. TARGET_TYPE target_type,
  535. int target_number,
  536. omp_sched_t kind,
  537. int modifier
  538. )
  539. {
  540. }
  541. void omp_get_schedule_target(
  542. TARGET_TYPE target_type,
  543. int target_number,
  544. omp_sched_t *kind,
  545. int *modifier
  546. )
  547. {
  548. }
  549. void omp_init_lock_target(
  550. TARGET_TYPE target_type,
  551. int target_number,
  552. omp_lock_target_t *lock
  553. )
  554. {
  555. }
  556. void omp_destroy_lock_target(
  557. TARGET_TYPE target_type,
  558. int target_number,
  559. omp_lock_target_t *lock
  560. )
  561. {
  562. }
  563. void omp_set_lock_target(
  564. TARGET_TYPE target_type,
  565. int target_number,
  566. omp_lock_target_t *lock
  567. )
  568. {
  569. }
  570. void omp_unset_lock_target(
  571. TARGET_TYPE target_type,
  572. int target_number,
  573. omp_lock_target_t *lock
  574. )
  575. {
  576. }
  577. int omp_test_lock_target(
  578. TARGET_TYPE target_type,
  579. int target_number,
  580. omp_lock_target_t *lock
  581. )
  582. {
  583. return 0;
  584. }
  585. void omp_init_nest_lock_target(
  586. TARGET_TYPE target_type,
  587. int target_number,
  588. omp_nest_lock_target_t *lock
  589. )
  590. {
  591. }
  592. void omp_destroy_nest_lock_target(
  593. TARGET_TYPE target_type,
  594. int target_number,
  595. omp_nest_lock_target_t *lock
  596. )
  597. {
  598. }
  599. void omp_set_nest_lock_target(
  600. TARGET_TYPE target_type,
  601. int target_number,
  602. omp_nest_lock_target_t *lock
  603. )
  604. {
  605. }
  606. void omp_unset_nest_lock_target(
  607. TARGET_TYPE target_type,
  608. int target_number,
  609. omp_nest_lock_target_t *lock
  610. )
  611. {
  612. }
  613. int omp_test_nest_lock_target(
  614. TARGET_TYPE target_type,
  615. int target_number,
  616. omp_nest_lock_target_t *lock
  617. )
  618. {
  619. return 0;
  620. }