3

Thrust ライブラリを使い始めたばかりです。デバイスで長さ 5 のベクトルを作成しようとしています。彼女は最初の要素のメンバーを設定していますvec[0]

  #include<thrust/device_vector.h>
  #include<iostream>
  .
  . 
  . 

  thrust::device_vector<uint2> vec(5);
  vec[0]=make_uint2(4,5);
  std::cout<<vec[0].x<<std::endl;

ただし、上記のコードではエラーが発生します

error: class "thrust::device_reference<uint2>" has no member "x"

1 error detected in the compilation of "/tmp/tmpxft_000020dc_00000000-4_test.cpp1.ii".

どこが間違っていますか?uint2with.xやなどのネイティブ CUDA ベクトル データ型のメンバーにアクセスするの.yが正しい方法だと思いました。

4

1 に答える 1

4

talonmies がコメントで指摘しているように、 が所有する要素のメンバーdevice_vector、または でラップされたオブジェクトに直接アクセスすることはできませんdevice_reference。ただし、この回答を提供して、問題に対する別のアプローチを示したいと思いました。

ラップされたオブジェクトのメンバーにアクセスすることはできませdevice_referenceんが、operator<<. このコードは期待どおりに動作するはずです:

#include <thrust/device_vector.h>
#include <iostream>

// provide an overload for operator<<(ostream, uint2)
// as one is not provided otherwise
std::ostream &operator<<(std::ostream &os, const uint2 &x)
{
  os << x.x << ", " << x.y;
  return os;
}

int main()
{
  thrust::device_vector<uint2> vec(5);
  vec[0] = make_uint2(4,5);
  std::cout << vec[0] << std::endl;
  return 0;
}
于 2011-12-28T22:36:40.443 に答える