2

配列内の最小要素を見つけようとしました:

 thrust::device_ptr<float> devPtr(d_ary);
 int minPos = thrust::min_element(devPtr.begin(), devPtr.end()) - devPtr.begin();

そして、コンパイル時に上記のエラーが発生しました。

この問題を解決するにはどうすればよいですか? ありがとう

4

1 に答える 1

3

特定した特定のエラーは、デバイス ポインターがコンテナーではないため、.begin()または.end()メンバーがないためです。yourdevPtrはコンテナではなく、Thrust で使用できるデバイス ポインタです。生のポインタをラップして devPtr を作成しましたが、生のポインタには、それが指しているデータ領域のサイズに関する情報が含まれていません。

ポインターには、begin や end のようなメンバーはありません。

次のいずれかの方法で問題を解決できます。

  1. .begin および .end イテレータが定義された推力ベクトル コンテナの使用に切り替える
  2. アクセスしているデータ領域 (d_ary) の開始ポインタと終了ポインタを手動で作成する

上記の後者のアイデアに沿ったコードの例を次に示します。

#include <thrust/device_ptr.h>
#include <thrust/extrema.h>

#define N 256
int main()
{

  float *d_a;

  cudaMalloc((void **) &d_a, N*sizeof(float));

  thrust::device_ptr<float> dPbeg(d_a);
  thrust::device_ptr<float> dPend = dPbeg + N;
  thrust::device_ptr<float> result = thrust::min_element(dPbeg, dPend);
}

興味のあるスラスト クイックスタート ガイドがあります。(わかりやすくするために、cudaMalloc 呼び出しをエラー チェックでラップしていません。cuda 呼び出しをエラー チェックでラップすることをお勧めします。)

于 2012-10-10T14:28:19.217 に答える