DPCT1099#
Message#
Verify if the default value of the direction and placement used in the function
<function name> aligns with the related compute
function call.
Detailed Help#
By default, the parameter direction_and_placement
is not passed for
dpct::fft::fft_engine::create()
, dpct::fft::fft_engine::commit()
, or
dpct::fft::fft_engine::estimate_size()
. In this case, a forward direction
(if the current FFT is complex-to-complex) and out-of-place (false) are used as
the default values in this API. The configuration of the direction and placement
is reset when executing dpct::fft::fft_engine::compute()
according to the
argument passed with the compute()
API. There might be performance issues
caused by the reconfiguration.
To avoid the potential performance issues, specify the parameter
direction_and_placement
explicitly when calling
dpct::fft::fft_engine::create()
or dpct::fft::fft_engine::commit()
, then
the direction and placement information passed by the compute()
API is
ignored and no reconfiguration happens.
Suggestions to Fix#
If you received a warning for dpct::fft::fft_engine::create()
or
dpct::fft::fft_engine::commit()
:
If you are using an internal workspace and do not care about performance, you can ignore this warning.
If you do care about performance, or if you are using an external workspace, specify the
direction_and_placement
parameter correctly.
If you received this warning for dpct::fft::fft_engine::estimate_size()
, you
need to specify the direction_and_placement
parameter correctly.
For example, this original CUDA* code:
1void foo(cufftHandle plan, float2 *idata, float2 *odata) {
2 size_t worksize;
3 cufftMakePlan1d(plan, 7, CUFFT_C2C, 2, &worksize);
4 cufftExecC2C(plan, idata, odata, CUFFT_INVERSE);
5}
results in the following migrated SYCL code:
1void foo(dpct::fft::fft_engine_ptr plan, sycl::float2 *idata,
2 sycl::float2 *odata) {
3 size_t worksize;
4 /*
5 DPCT1100:0: Currently the DFT external workspace feature in the Intel(R)
6 oneAPI Math Kernel Library (oneMKL) is only supported on GPU devices. Use the
7 internal workspace if your code should run on non-GPU devices.
8 */
9 /*
10 DPCT1099:1: Verify if the default value of the direction and placement used in
11 the function "commit" aligns with the related "compute" function call.
12 */
13 plan->commit(&dpct::get_in_order_queue(), 7,
14 dpct::fft::fft_type::complex_float_to_complex_float, 2,
15 &worksize);
16 plan->compute<sycl::float2, sycl::float2>(idata, odata,
17 dpct::fft::fft_direction::backward);
18}
which is rewritten to:
1void foo(dpct::fft::fft_engine_ptr plan, sycl::float2 *idata,
2 sycl::float2 *odata) {
3 // idata and odata are different memory
4 size_t worksize;
5 plan->commit(
6 &dpct::get_in_order_queue(), 7,
7 dpct::fft::fft_type::complex_float_to_complex_float, 2, &worksize,
8 std::make_pair(
9 dpct::fft::fft_direction::backward /*In the next compute() function,
10 the direction is backward. So no need to change here.*/
11 ,
12 false /*is_inplace. In the next compute() function, idata and
13 odata are different memory, so set false here*/
14 ));
15 plan->compute<sycl::float2, sycl::float2>(idata, odata,
16 dpct::fft::fft_direction::backward);
17}