2

次のコードは、Intel/nVidia OpenCL コンパイラ (どちらも LLVM ベース) でコンパイルされます。

struct Foo{ float2 bar; };
void baz(){
   global struct Foo* foo;
   ((float*)(&foo->bar))[1]=1;
}

AMD コンパイラは、次のように修飾されinvalid type conversionたコードのみを受け入れます。global

((global float*))(&foo->bar))[1]=1;

仕様上正しいのはどれか。(そして: 非準拠のコンパイラをどこかに報告する必要がありますか?)

4

1 に答える 1

1

OpenCL 仕様では、ポインターのキャストに関してほぼ無限の柔軟性が可能です。基本的に、ルールは、プログラマーが特定のハードウェアに対して何をしているかを知っているということです。メモリ空間全体でキャストするという特定の問題には対処していないため、これはおそらく未定義の動作と見なす必要があります。ベンダー間の違いが予想されます。

CL 仕様が成熟するにつれて、上記のような問題が明示的に対処されることを期待できます。

于 2012-02-02T18:53:39.347 に答える