問題タブ [thrust]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2720 参照

c++ - NvidiaのThrustライブラリを使用して一連のベクトルを正規化します

Nvidiaのスラストライブラリについて知りました。試してみるだけで、一連のベクトルを正規化することになっている小さな例を書きました。

上記の例は機能しているようですが、データをコピーして戻すことができません。単純な割り当てでcudaMemcpyが呼び出されると思いました。ホストからデバイスにデータをコピーするように機能しますが、元に戻すことはできません???

第二に、これを正しい方法で行うかどうかはわかりません。for_eachのドキュメントには次のように書かれています。

for_eachは、関数オブジェクトfを[first、last);の範囲の各要素に適用します。fの戻り値がある場合は、無視されます。

ただし、unary_function構造体テンプレートは2つのテンプレート引数(1つは戻り値用)を想定しており、operator()も値を返すように強制します。これにより、コンパイル時に警告が発生します。戻り値のない単項ファンクターをどのように書くべきかわかりません。

次はデータの配置です。double4を選択したのは、2つのフェッチ命令ld.v2.f64とld.f64IIRCが生成されるためです。ただし、thrustが内部でデータをフェッチする方法(およびcudaスレッド/ブロックの数)が作成されるのではないかと思います。代わりに4つのベクトルの構造体を選択すると、合体した方法でデータをフェッチできるようになります。

最後に、推力はタプルを提供します。タプルの配列はどうですか?この場合、データはどのように配置されますか。

例を調べましたが、一連のベクトルに対してどのデータ構造を選択するかを説明する例は見つかりませんでした(dot_products_with_zip.cuの例では、「構造の配列」ではなく「配列の構造」について説明していますが、この例では構造は使用されていません。

アップデート

上記のコードを修正し、より大きな例を実行しようとしました。今回は10kのベクトルを正規化します。

Computeprofを使用したプロファイリングでは、占有率が低く、非合体のメモリアクセスが示されます。

どうすればこれを最適化できるのだろうか?

0 投票する
1 に答える
1668 参照

sorting - 推力:zip_iteratorパフォーマンスを備えたsort_by_key

問題

を使用sort_by_keyして渡される値で使用していますzip_iterator。これsort_by_keyは何度も呼び出され、特定の反復の後、10倍遅くなりますこのパフォーマンスの低下の原因は何ですか?

症状

を使用して3つのベクトルを並べ替えsort_by_keyていますが、そのうちの1つがキーベクトルとして機能します。

ベクトルのサイズは通常約400万です。呼び出された最初の2回では、sort_by_key0.04秒かかり、ループ3では0.1秒かかり、残りのループではさらに0.3秒に低下します。したがって、パフォーマンスが10倍低下します。

追加情報

劣化の唯一の要因がであるようにするためにsort_by_key、上記を手書きカーネルを使用した手動ソートに置き換えました。

この手書きの並べ替えには0.03秒かかり、sort_by_keyやzip_iteratorで見られるパフォーマンスの低下とは異なり、このパフォーマンスはすべての反復で一貫しています。

0 投票する
1 に答える
2955 参照

c++ - 文字列の NVidia Thrust device_vector

CUDA 4.0 ツールキットの一部として提供される NVidia Thrust ライブラリの使用を開始し、深く掘り下げる前に何かを検証したいと考えました。以下を実行でき、ビルド中に問題はありません。

次のことを試みると、コンパイル エラーが発生します。

私が知りたいのは、デバイスまたはホストに関係なく、STL ベクトルで使用できる任意のデータ型を推力ベクトルで使用できると仮定できるかどうかです。または、ここに制限があり、これが機能することを期待すべきではありませんか?

私が得るエラーは次のとおりです。

c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\device\cuda\for_each.inl(93): エラー C2027: 未定義の型 'thrust::detail::STATIC_ASSERTION_FAILURE' の使用1> with 1> [ 1> x=false 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\device\dispatch\for_each.h(56) : 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>、 1> Size=__w64 int, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\device\for_each.inl(43) : 関数テンプレートのインスタンス化への参照を参照 'RandomAccessIterator throw::detail::device::dispatch:: for_each_n(RandomAccessIterator,Size,UnaryFunction,thrust::detail::cuda_device_space_tag)' は 1> [ 1> RandomAccessIterator=thrust::detail::normal_iterator>, 1> OutputIterator=thrust::detail::normal_iterator> でコンパイルされています。 , 1> Size=__w64 int, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\device\for_each .inl(54) : 関数テンプレートのインスタンス化への参照 'OutputIterator 推力::詳細::デバイス::for_each_n(OutputIterator,Size,UnaryFunction)' は 1> [ 1> OutputIterator=thrust::detail::normal_iterator>, 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust:: でコンパイルされています。 detail::device_destroy_functor, 1> Size=__w64 int 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\dispatch\for_each.h(72) : リファレンスを参照1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust で 1> コンパイルされている関数テンプレートのインスタンス化 'InputIterator throw::detail::device::for_each(InputIterator,InputIterator,UnaryFunction)' ::detail::device_destroy_functor 1> ] 1>c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\for_each.inl(51) : 関数テンプレートのインスタンス化への参照を参照してください,InputIterator,UnaryFunction,thrust::device_space_tag)' がコンパイルされている 1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c: \program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\for_each.inl(67) : 関数テンプレートのインスタンス化への参照を参照' コンパイル中 1> 1> [ 1> InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\dispatch\destroy.h(59) : 1> [ 1> ForwardIterator=thrust::detail::normal_iterator>, 1> T=value_type, 1 でコンパイルされている関数テンプレートのインスタンス化 'void Thrust::for_each>(InputIterator,InputIterator,UnaryFunction)' への参照を参照してください。 > InputIterator=thrust::detail::normal_iterator>, 1> UnaryFunction=thrust::detail::device_destroy_functor 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\detail \destroy.h(42) : 関数テンプレートのインスタンス化への参照を参照してください 'ボイド スラスト::詳細::dispatch::destroy(ForwardIterator,ForwardIterator,thrust::detail::false_type)' は 1> [ 1> ForwardIterator=thrust::detail::normal_iterator> 1> ] 1> c:\program files\nvidia でコンパイルされていますgpu コンピューティング ツールキット\cuda\v4.0\include\thrust\detail\vector_base.inl(442) : 関数テンプレートのインスタンス化への参照を参照してください。 1> [ 1> Pointer=thrust::device_ptr, 1> ForwardIterator=thrust::detail::normal_iterator> 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\ detail\vector_base.inl(440) : クラス テンプレート メンバ関数 'thrust::detail::vector_base:: のコンパイル中~vector_base(void)' 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0 \include\thrust\device_vector.h(55) : 1> [ 1> T=std::string, 1> Alloc=thrust: でコンパイルされているクラス テンプレートのインスタンス化 'thrust::detail::vector_base' への参照を参照してください: :device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) : クラス テンプレートのインスタンス化 'thrust::device_vector' が 1> [ 1> T=std でコンパイルされている参照を参照してください。 ::string 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h (55) : 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c でコンパイルされているクラス テンプレートのインスタンス化 'thrust::detail::vector_base' への参照を参照してください:\users\fsquared\mydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] == でコンパイルされているクラス テンプレートのインスタンス化 'thrust::device_vector' への参照を参照してください======== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h (55) : 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c でコンパイルされているクラス テンプレートのインスタンス化 'thrust::detail::vector_base' への参照を参照してください:\users\fsquared\mydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] == でコンパイルされているクラス テンプレートのインスタンス化 'thrust::device_vector' への参照を参照してください======== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h(55) : リファレンスを参照クラス テンプレートのインスタンス化 'thrust::detail::vector_base' は 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\ でコンパイルされますmydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] ======== でコンパイルされているクラス テンプレートのインスタンス化 'thrust::device_vector' への参照を参照してください== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h(55) : リファレンスを参照クラス テンプレートのインスタンス化 'thrust::detail::vector_base' は 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\ でコンパイルされますmydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] ======== でコンパイルされているクラス テンプレートのインスタンス化 'thrust::device_vector' への参照を参照してください== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h(55) : クラス テンプレートのインスタンス化 'thrust::detail::vector_base' がコンパイルされている参照を参照してください 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) : クラス テンプレートのインスタンス化への参照を参照してください'thrust::device_vector' がコンパイルされています 1> with 1> [ 1> T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、 0 スキップ ==========] 1> c:\program files\nvidia GPU コンピューティング ツールキット\cuda\v4.0\include\thrust\device_vector.h(55) : クラス テンプレートのインスタンス化 'thrust::detail::vector_base' がコンパイルされている参照を参照してください 1> with 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] 1> c:\users\fsquared\mydata\idata\main.cpp(119) : クラス テンプレートのインスタンス化への参照を参照してください'thrust::device_vector' がコンパイルされています 1> with 1> [ 1> T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、 0 スキップ ==========vector_base' は 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] でコンパイルされています 1> c:\users\fsquared\mydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0最新、0 スキップ ==========vector_base' は 1> [ 1> T=std::string, 1> Alloc=thrust::device_malloc_allocator 1> ] でコンパイルされています 1> c:\users\fsquared\mydata\idata\main.cpp(119) : 1> [ 1> T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0最新、0 スキップ ==========T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========T=std::string 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========

ここでは MSCV 2010 を使用しています。

0 投票する
1 に答える
2892 参照

cuda - Thrust::Sort のコンパイル時間が非常に長い

CUDA の学習を支援するために、Thrust を使用してサンプル コードのブロックをコンパイルしようとしています。

私は Visual Studio 2010 を使用しており、コンパイルする他の例を入手しました。ただし、この例をコンパイルすると、コンパイルに 10 分以上かかります。行を選択的にコメントアウトし、その Thrust::sort 行が永遠にかかることを理解しました (その 1 行をコメントアウトすると、コンパイルに約 5 秒かかります)。

Thrust での sort のコンパイルがどのように遅いかについて話している投稿をどこかで見つけました。これは Thrust 開発チームが下した決定でした (実行時は 3 倍高速ですが、コンパイルには時間がかかります)。しかし、その投稿は2008年後半のことです。

なぜこれに時間がかかるのですか?

また、私は次のスペックのマシンでコンパイルしているので、遅いマシンではありません

i7-2600k @ 4.5 GHz
16 GB DDR3 @ 1833 MHz
Raid 0 of 6 GB/s 1TB ドライブ

要求どおり、これは Visual Studio が呼び出しているように見えるビルド文字列です

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.2\include" -G0 --keep-dir "Debug\" -maxrregcount=32 --machine 64 --compile -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /nologo / Od /Zi /MTd " -o "Debug\kernel.obj" "C:\Users\Rob\Desktop\VS2010Test\VS2010Test\VS2010Test\kernel.cpp" -clean

0 投票する
2 に答える
312 参照

c++ - CUDACプロジェクトでのC++の使用

私はCUDACでソートとストリームの圧縮アルゴリズムを実装しています。しかし、これらのアルゴリズムを自分で優れたパフォーマンスで実装するのはそれほど簡単ではないことがわかりました。マトリックスを使用していることを考えると、CUDPPは使用できないため、回避していましたが、スラストライブラリを使用する必要があります(C ++については何も知りません)。

私はCでプログラミングしてきましたが、実際にはC ++を使用して推力を処理したいので、基本的に、コードの大部分をCで使用してから、C ++コードを少し使用できるかどうかを知りたいと思います( 「外部」機能を使用する必要があります)が、CUDAで実行可能かどうかを確認したかったのです。

前もって感謝します。

0 投票する
1 に答える
435 参照

cuda - CUDA プロジェクトのアセンブル

私は大規模な CUDA プロジェクトに関する質問を求めてサイトをスキャンしており、いくつかの良い回答を見つけましたが、とにかくまだ疑問があります.

私のプログラムは、今のところ (まだ完成の途中です)、いくつかの配列を出力し、それが Thrust ライブラリ関数の入力になります。

したがって、私の主な疑問は次のとおりです。

1-CUDA C を使用していることを考えると、extern "C" として宣言された推力関数があります。ヘッダー ファイルでこれらの関数を宣言する正しい方法がわかりませんでした。グーグルで調べた後、次のコードを見つけました。これが正しいことを確認したかったのです。

2- フォーラムで「Main.cpp」をメイン ファイルとして使用している投稿を見たことがありますが、「Main.cu」ファイルを使用するのは間違っていますか、それとも無関心ですか?

編集: いくつかの考え (およびアドバイス) の後、古い質問は少し退屈だったと思います。

事前に感謝し、アドバイスをありがとうタロンミー

0 投票する
1 に答える
2478 参照

cuda - CUDA /推力ダブルポインター問題(ポインターのベクトル)

ねえ、私はCUDAとThrustライブラリを使用しています。ホストからObject*型のthrust::device_vector(ポインターのベクトル)がロードされたCUDAカーネル上のダブルポインターにアクセスしようとすると、問題が発生します。「nvcc-othrustmain.cpp cukernel.cu」を使用してコンパイルすると、「警告:グローバルメモリスペースを想定しているため、ポインタが何を指しているのかわかりません」という警告と、プログラムを実行しようとすると起動エラーが発生します。

Nvidiaフォーラムを読みましたが、解決策は「CUDAカーネルでダブルポインターを使用しないでください」のようです。カーネルに送信する前に、ダブルポインタを1Dポインタに折りたたむつもりはありません...この問題の解決策を見つけた人はいますか?必要なコードは以下のとおりです。よろしくお願いします。

0 投票する
1 に答える
553 参照

matlab - 大きな値にCUDAの推力ライブラリを使用する

こんにちは私は推力が非常に大きいループを実装したかったのですが、通常のC++コードよりもはるかに遅いことがわかりました。どこがおかしいのか教えてください。fiとfjはホストベクトルです

xsizeは通常、約7〜8桁の数字です

コードが並列化されていないように感じます。手伝ってくれませんか。

0 投票する
3 に答える
1574 参照

c++ - CUDA/推力画像処理

Thrust ライブラリが行列演算をサポートできるかどうかについての情報は見つかりませんでした。そのため、Thrust ライブラリを画像処理で使用できないかどうか疑問に思っていました。また、作例があれば見てみたいです。

返信ありがとうございます。

0 投票する
1 に答える
2508 参照

sorting - Thrust Library Radix Sort を使用した CUDA プログラミング

Thrust の初心者 - 私の VS2010 C++ プログラムでは、問題なく動作しています。

しかし、今私は推力を使いたい::stable_radix_sort_key. インクルードを追加しました-

しかし、VSは見つかりません"thrust :: stable_radix_sort_key ( ...)"

関連するヘッダー ファイルがディレクトリに見つからないと思いますか? どうしたの。このスラスト ライブラリ ルーチンを呼び出すサンプル コードはありますか?

ありがとう。