DPCT1097
目次
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 }
修正方法の提案#
オリジナルコードを調整する必要があります。