DPCT1074#

メッセージ#

SYCL* イメージクラスは、オリジナルコードで使用されている一部のフラグをサポートしていません。サポートされないフラグは無視されます。SYCL* イメージから読み取られたデータは、元のコードで指定されるように正規化できませんでした。

詳細な説明#

CU_TRSF_READ_AS_INTEGER が設定されていない限り、元のコード内の tex から読み取られたデータは、デフォルトで (0, 1] の範囲の浮動小数点数に正規化されます。SYCL* イメージから読み取ったデータを、標準の SYCL* API を使用して (0, 1] の範囲の浮動小数点に正規化することができません。オリジナルコードで使用されているフラグは、座標正規化モードを除いてすべて無視されます。

修正方法の提案

コードを手動で調整してください。

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

1   // User does not set CU_TRSF_READ_AS_INTEGER here.
2   cuTexRefSetFlags(tex, CU_TRSF_NORMALIZED_COORDINATES); 
3   cuTexRefSetFormat(tex, CU_AD_FORMAT_UNSIGNED_INT16, 1); 
4     ... 
5   result = tex2D<float>(tex, 0.5f, 0.5f);

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

1   /* 
2   DPCT1074:0: The SYCL Image class does not support some of the flags used in 
3   the original code. Unsupported flags were ignored. Data read from SYCL Image 
4   could not be normalized as specified in the original code.
5   */ 
6   tex->set(sycl::coordinate_normalization_mode::normalized); 
7   tex->set_channel_type(sycl::image_channel_type::unsigned_int16); 
8   tex->set_channel_num(1); 
9     ... 
10  result = tex.read(0.5f, 0.5f); // data normalization does not match original code

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

1   tex->set(sycl::coordinate_normalization_mode::normalized); 
2   tex->set_channel_type(sycl::image_channel_type::unsigned_int16); 
3   tex->set_channel_num(1); 
4     ... 
5   result = tex.read(0.5f, 0.5f) / float(std::numeric_limits<std::uint16_t>::max());