2012-05-07 22 views
3

char*のポインタをOpenCLカーネルの関数int*にタイプキャストする方法を教えてください。 ((int*) char_pointer)を試しましたが、動作しません。openCLのchar *をint *にキャストする方法

+2

何かエラーがありますか? – user1202136

+0

コンパイラで厳密なエイリアシングを無効にすることを忘れないでください。厳密なエイリアシング規則のためにこのような操作は有効ではありませんが、ほとんどのコンパイラではオフにすることができます。 –

+0

/tmp/OCLqZ3crS.cl(710):エラー:無効な型変換 a [0] = *((int *)allocatedBuf); allocatedBufの型がグローバルchar * – sahil

答えて

10

正しいアドレススペースでポインタを修飾する必要があると思います。

アドレス空間を指定しないと、__privateが想定されますが、ソースポインタは(コメントの)__globalポインタと思われるので、アドレススペースは互換性がありません。

(int*)の代わりに(__global int*)を使用してみてください。

+0

ありがとうございました...私の問題を解決しました – sahil

0

スタッフ組合内のポインタ、int型*でそれを使用し、文字の*を初期化します。

union { 
    char *cp; 
    int *ip; 
} ptr; 

ptr.cp = allocatedBuf; 
a[0] = *(ptr.ip); 

醜いが、少なくともCでそれは未定義の動作ですが、キャストせずにトリックを行いますが、ねえ、あなたはハートのモニターでこれを使用していないか、反対側の核弾頭で使用していますよね?

+1

コードが公開され、ある企業が原子力発電所でそれをいつか使用するとどうなりますか? – hochl

+0

これはUBではないと思います。OpenCL Cは、最後に書かれたものとは異なるユニオンメンバーを明示的に読めるようにしています(少なくともサイズが一致する場合はここでそうです)。これはOpenCL CのベースとなっているC99でもそうかもしれませんが、私はそれについては分かりません。しかし、それは不一致のアドレス空間に置かれているので、とにかく問題を解決することはできません。 –

+0

私は彼らに言ったので、彼らは私を非難することはできません。真剣に、受け入れられた答えのキャストよりも同じことが起こります。ミスアライメントされたポインタを使用すると、常に問題が発生することがあります。 – Jens

関連する問題