DPCT1099
目次
DPCT1099#
メッセージ#
関数 <function name> で使用される方向と配置のデフォルト値、関連する計算関数呼び出しと一致しているかどうかを確認します。
詳細な説明#
デフォルトでは、direction_and_placement
パラメーターは、dpct::fft::fft_engine::create()
, dpct::fft::fft_engine::commit()
、または dpct::fft::fft_engine::estimate_size()
に渡されません。この場合、この API は順方向 (現在の FFT が複素数 - 複素数の場合) とアウトオブプレイス (false) がデフォルトとして使用されます。方向と配置の設定は、compute()
API に渡された引数に従って dpct::fft::fft_engine::compute()
を実行することでリセットされます。再構成によってパフォーマンスの問題が発生する可能性があります。
潜在的なパフォーマンスの問題を解決するには、dpct::fft::fft_engine::create()
または dpct::fft::fft_engine::commit()
を呼び出す際にパラメーター direction_and_placement
を明示的に指定しすると、compute()
API から渡される計算の方向と配置情報は無視され、再構成は行われません。
修正方法の提案
dpct::fft::fft_engine::create()
または dpct::fft::fft_engine::commit()
に関連する警告があった場合:
内部ワークスペースを使用していてパフォーマンスを気にしていない場合、この警告は無視してもかまいません。
パフォーマンスを重視する場合、または外部ワークスペースを使用している場合は、
direction_and_placement
パラメーターを正しく指定してください。
dpct::fft::fft_engine::estimate_size()
に対してこの警告が示される場合、direction_and_placement
パラメーターを適切に設定します。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 void 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 }
このコードは、以下の SYCL* コードに移行されます。
1 void 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 }
このコードは次のように書き換えられます。
1 void 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 }