2016-11-02 8 views
1

私はVexCL機能を再構築テストする次のコードスニペットを持っている:VexCL形状変更振る舞う不思議

std::vector<int> ints; 
for (int i = 0; i < n; i++) ints.push_back(i); 
vex::vector<int> vex_ints(ctx, ints); 
vex_ints = vex::reshape(vex_ints, vex::extents[2][n/2], vex::extents[1][0]); 
for(int i=0; i<n; i++) std::cout << vex_ints[i] << " "; std::cout << std::endl; 

それがないすべてがn n個未満の奇数の整数が続くほどであっても、整数を印刷しています。たとえば、n = 10の場合、次のように表示されます。

0 2 4 6 8 1 3 5 7 9 

しかし、nが大きくなると、物が奇妙に動作します。開始さ

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 

はさらに出力ダウン、他の食い違いがあり、それが間違っ62の後に取得するために、そしていくつかの偶数、奇数番号の後に発生します。たとえば、N = 10000の場合は、最初の50個のプリント整数です。誰がなぜこれが起こっているのか説明できますか?重要なのは、私が使った文脈は「GeForce GT 650M(Apple)」です。

+1

1D arrrayでなぜ 'vex :: extents [1] [0]'?それはちょうど 'vex :: extents [0]'であるべきですか? – DarkZeros

+0

私はvex :: extentsオブジェクトを使って形状を定義しています。したがって、この場合、行列はn/2行×2列であると言います。私はドキュメントからの行列転置の例に従った。 –

+0

それは再構成セクションの下にあります[ここ](http://vexcl.readthedocs.io/en/latest/expressions.html#reshaping) –

答えて

1

式から生成されるカーネルは、入力と出力の両方にvex_intsを使用します。 vex::reshapeは基本的には置換であるため、これを行うことはできません。結果を別のベクターに割り当てて、問題が解決しているかどうかを確認してください。

+0

それはうまくいった。ありがとう! –

関連する問題