DPCT1008
目次
DPCT1008#
メッセージ#
<function name> 関数は SYCL* では定義されていません。これは、ハードウェア固有の機能です。代替関数については、ハードウェア・ベンダーにお問い合わせください。
詳細な説明#
clock 関数呼び出しは、SYCL* では定義されていないため、置き換えられませんでした。このハードウェア固有の機能を、ハードウェア・ベンダーが提供するものに置き換えてください。
修正方法の提案#
代替関数については、ハードウェア・ベンダーにお問い合わせください。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 __global__ void k(clock_t *timer) {
2 int tid = threadIdx.x;
3 if (tid == 0)
4 timer[0] = clock();
5
6 // workload
7
8 __syncthreads();
9 if (tid == 0)
10 timer[1] = clock();
11 }
12
13 int main() {
14 clock_t *dtimer = NULL;
15 cudaMalloc((void **)&dtimer, sizeof(clock_t) * 2);
16 clock_t timer[2];
17 k<<<1, 128>>>(dtimer);
18 cudaMemcpy(timer, dtimer, sizeof(clock_t) * 2, cudaMemcpyDeviceToHost);
19 cudaFree(dtimer);
20 long double time = timer[1] - timer[0];
21 return 0;
22 }
このコードは、以下の SYCL* コードに移行されます。
1 #include <sycl/sycl.hpp>
2 #include <dpct/dpct.hpp>
3 #include <time.h>
4 void k(clock_t *timer, sycl::nd_item<3> item_ct1) {
5 int tid = item_ct1.get_local_id(2);
6 if (tid == 0)
7 /*
8 DPCT1008:1: clock function is not defined in SYCL.This is a
9 hardware-specific feature.Consult with your hardware vendor to find a
10 replacement.
11 */
12 timer[0] = clock();// clock() is used to measure the kernel runtime
13
14 // workload
15
16 item_ct1.barrier();
17 if (tid == 0)
18 /*
19 DPCT1008:2: clock function is not defined in SYCL.This is a
20 hardware-specific feature.Consult with your hardware vendor to find a
21 replacement.
22 */
23 timer[1] = clock();
24 }
25
26 int main() {
27 dpct::device_ext &dev_ct1 = dpct::get_current_device();
28 sycl::queue &q_ct1 = dev_ct1.default_queue();
29 clock_t *dtimer = NULL;
30 dtimer = sycl::malloc_device<clock_t>(2, q_ct1);
31 clock_t timer[2];
32 q_ct1.parallel_for(
33 sycl::nd_range<3>(sycl::range<3>(1, 1, 128), sycl::range<3>(1, 1, 128)),
34 [=](sycl::nd_item<3> item_ct1) {
35 k(dtimer, item_ct1);
36 });
37 q_ct1.memcpy(timer, dtimer, sizeof(clock_t) * 2).wait();
38 sycl::free(dtimer, q_ct1);
39 long double time = timer[1] - timer[0];
40 return 0;
41 }
このコードは次のように書き換えられます。
1 #define DPCT_PROFILING_ENABLED
2 #include <sycl/sycl.hpp>
3 #include <dpct/dpct.hpp>
4 #include <time.h>
5 void k(sycl::nd_item<3> item_ct1) {
6 // workload
7 }
8
9 int main() {
10 dpct::device_ext &dev_ct1 = dpct::get_current_device();
11 sycl::queue &q_ct1 = dev_ct1.default_queue();
12 dpct::event_ptr start;
13 dpct::event_ptr end;
14 start = new sycl::event();
15 end = new sycl::event();
16 *start = q_ct1.ext_oneapi_submit_barrier();
17 q_ct1.parallel_for(
18 sycl::nd_range<3>(sycl::range<3>(1, 1, 128), sycl::range<3>(1, 1, 128)),
19 [=](sycl::nd_item<3> item_ct1) {
20 k(item_ct1);
21 });
22 *end = q_ct1.ext_oneapi_submit_barrier();
23 end->wait_and_throw();
24 long double time =
25 (end->get_profiling_info<sycl::info::event_profiling::command_end>() -
26 start
27 ->get_profiling_info<sycl::info::event_profiling::command_start>()) /
28 1000000.0f; return 0;
29 }