DPCT1097#

メッセージ#

関数 <backward function name> には、関数 <forward function name> からの中間結果を保存するためにワークスペースが必要になる場合があります。デフォルトでは、engine_ext のワークスペースがソースデータのポインターに従って選択されますが、これは正しくない可能性があり、ワークスペースのデータ競合を引き起こす可能性があります。コードを修正する必要があります。

詳細な説明#

フォワード関数で生成された dnnl::memory オブジェクトを、バックエンド関数に手動で渡すことができます。

例えば、以下のオリジナル CUDA* コードについて考えてみます。

1  void test(cudnnHandle_t handle, cudnnTensorDescriptor_t dataTensor, 
2   cudnnTensorDescriptor_t outTensor, 
3   cudnnTensorDescriptor_t diffdataTensor, 
4   cudnnTensorDescriptor_t diffoutTensor, float *data, float *out, 
5   float *diffdata, float *diffout, float alpha, float beta, 
6   cudnnLRNDescriptor_t desc) { 
7   ...
8   cudnnLRNCrossChannelForward(handle, desc, CUDNN_LRN_CROSS_CHANNEL_DIM1, 
9   &alpha, dataTensor, data, &beta, outTensor, out); 
10  ... 
11  cudnnLRNCrossChannelBackward(handle, desc, CUDNN_LRN_CROSS_CHANNEL_DIM1, 
12  &alpha, outTensor, out, diffoutTensor, diffout, 
13  dataTensor, data, &beta, diffdataTensor, 
14  diffdata); 
15  ... 
16 }

このコードは、以下の SYCL* コードに移行されます。

1  void test(dpct::dnnl::engine_ext handle, dpct::dnnl::memory_desc_ext dataTensor, 
2   dpct::dnnl::memory_desc_ext outTensor, 
3   dpct::dnnl::memory_desc_ext diffdataTensor, 
4   dpct::dnnl::memory_desc_ext diffoutTensor, float *data, float *out, 
5   float *diffdata, float *diffout, float alpha, float beta, 
6   dpct::dnnl::lrn_desc desc) { 
7   ... 
8   handle.async_lrn_forward(desc, alpha, dataTensor, data, beta, outTensor, out); 
9   ... 
10  /* 
11  DPCT1097:0: The function "async_lrn_backward" may require the workspace used 
12  to save intermediate results from function "async_lrn_forward".By default, a 
13  workspace from engine_ext is selected according to the source data pointer, 
14  but this may be incorrect and cause a workspace data race.You may need to 
15  rewrite this code.
16  */ 
17  handle.async_lrn_backward(desc, alpha, outTensor, out, diffoutTensor, diffout, 
18  dataTensor, data, beta, diffdataTensor, diffdata); 
19  ... 
20}

このコードを以下のように手動で調整します。

1  void test(dpct::dnnl::engine_ext handle, dpct::dnnl::memory_desc_ext dataTensor, 
2   dpct::dnnl::memory_desc_ext outTensor, 
3   dpct::dnnl::memory_desc_ext diffdataTensor, 
4   dpct::dnnl::memory_desc_ext diffoutTensor, float *data, float *out, 
5   float *diffdata, float *diffout, float alpha, float beta, 
6   dpct::dnnl::lrn_desc desc) { 
7   ... 
8   dnnl::memory workspace; 
9   handle.async_lrn_forward(desc, alpha, dataTensor, data, beta, outTensor, out, 
10  &workspace); 
11  ... 
12  handle.async_lrn_backward(desc, alpha, outTensor, out, diffoutTensor, diffout, 
13  dataTensor, data, beta, diffdataTensor, diffdata, 
14  &workspace); 
15  ... 
16 }

修正方法の提案#

オリジナルコードを調整する必要があります。