16.1 では、このコードは、依存性のために外側のループがシリアル化され、内部ループの依存性が#pragma ivdep によって削除された場合、期待どおりに動作しました。
このループは、内部ループとの真の依存性のためにシリアル化されます。
for (中文字 x = 0、x < 4;x) {
スループには反復間の依存性がありませんが、外側のループに依存します
ivdep の#pragma
for (y = 0、y<64、y) {
17.0 では、#pragma ivdep が内部ループと外ループの両方に適用されるようになりました。そのため、外ループ内の依存性はコンパイラーでは考慮されません。 その結果、エミュレーションで動作しているにもかかわらず、ハードウェアで同様のコードが正しく動作しなくなる可能性があります。
回避 策:
1. カーネルに「スチーバー」という余分な引数を追加します。 ホスト側では、必ずこの引き受け引数に 1 を渡してください。
以前は
無効__kernel my_kernel(
__global cpx_t* は入力を制限します。
__global cpx_t* 制限結果)
後
無効__kernel my_kernel(
__global cpx_t* は入力を制限します。
__global cpx_t* は結果を制限します。
int --0466666
2. ループの入り込みで、「if (スループ)」でループを包みます。
このループは、真の依存性のためにシリアル化されます。
for (中文字 x = 0、x < 4;x) {
if (卉卉)
64 回の繰り返しの各セット内に依存性がありません
ivdep の#pragma
for (y = 0、y<64、y) {
この問題は、FPGA SDK 向けインテル© OpenCL™ の今後のバージョンで修正される予定です。