C++ AMPを用いたGPUプログラミングwiki
首都大学東京 田川研究室
C++ AMP 目次へ

arrayクラスの型を変更しよう

一度確保したarrayクラスは、同じ型、次元のarray_viewクラスでしかアクセスできなかったと思いますが、これでは不便な時があります。
C++ AMPではメモリの型の解釈を変更することができます。以下にコード例を示します。
    extent<2> AEx(100 , 100);
    array<int , 2> vAGpu(AEx);
    array_view<float , 1> vAf = vAGpu.reinterpret_as<float>();
    array_view<float , 2> vAfR = vAGpu.view_as<2>(AEx);
順に説明していきます。
extent<2> AEx(100 , 100);
配列数を格納したextentクラスです。
array<int , 2> vAGpu(AEx);
これが実際にメモリが確保されるコードです。この場合、int型として解釈するように設定しています。しかし、floatとして解釈したいです。そこで次のコードを書きます。
array_view<float , 1> vAf = vAGpu.reinterpret_as<float>();
arrayクラスからreinterpret_asを呼び出します。型の解釈を変更して、その解釈として動作するarray_viewクラスを返してくれます。一つ面倒なのが、1次元配列としてしか解釈できなことです。最悪これでもよいのですが2次元配列として立て直す方法があります。それが次の
array_view<float , 2> vAfR = vAGpu.view_as<2>(AEx);
となります。この関数は配列の次元を変更する関数です。引数としてはテンプレートに次元数、関数の引数に配列の各方向への長さをextentクラスとして渡します。最初に指定したものと通常同じですが、intとfloatのように型の大きさが同じでない場合、変更する必要があるかもしれません。元のメモリ容量を超過しない場合は問題ないと思います。
このようにarray_viewクラスは元のデータをどのように解釈するか選ぶことができます。