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 }