デフォルトストリームをクエリするときのcudaStreamQueryの動作を理解するにはどうすればよいですか?

ナンシャオ

CUDAマニュアルから、私cudaStreamQueryは非同期ストリームで動作することを知っています:

非同期ストリームに完了ステータスを照会します。

「デフォルトストリーム」での動作をテストする簡単なプログラムを作成します。

#include <cstdlib>
#include <iostream>

#define cudaSafeCall(call)  \
        do {\
            cudaError_t err = call;\
            if (cudaSuccess != err) \
            {\
                std::cerr << "CUDA error in " << __FILE__ << "(" << __LINE__ << "): " \
                    << cudaGetErrorString(err) << '\n';\
                exit(EXIT_FAILURE);\
            }\
        } while(0)

int main(void)
{
  int N = 1<<20;
  float *x, *d_x;
  x = (float*)malloc(N*sizeof(float));

  cudaSafeCall(cudaMalloc(&d_x, N*sizeof(float))); 

  cudaSafeCall(cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyDefault));

  cudaSafeCall(cudaStreamQuery(0));

  cudaSafeCall(cudaFree(d_x));

  free(x);

  return 0;
}

ビルドして実行します。

$ nvcc sync_test.cu -o sync_test
$ ./sync_test
CUDA error in sync_test.cu(25): device not ready

とのcudaStreamSynchronize(0);間に追加した後、エラーは消えました:cudaMemcpycudaStreamQuery

cudaSafeCall(cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyDefault));
cudaSafeCall(cudaStreamSynchronize(0));
cudaSafeCall(cudaStreamQuery(0));

私は少し混乱しています:
a)cudaMemcpy()ホストコードと同期しているので、cudaMemcpy返された後、このストリームのコピー作業を行う必要がありcudaStreamQuery(0)ますが、最初のケースでエラー返されるのはなぜですか?
b)cudaStreamQueryデフォルトのストリームではなく、非同期ストリームでのみ機能するcudaStreamQuery場合、2番目のケースでエラーが返されないのはなぜですか?

ロバート・クロベラ

あなたのステートメントa)は、サンプルコードの特定のケースに対して完全に正確ではありません。

a)cudaMemcpy()ホストコードと同期しているため、cudaMemcpy返された後、このストリームのコピー作業を実行する必要があります。

ドキュメントのためcudaMemcpyの状態:

この関数は、ほとんどのユースケースで同期動作を示します。

同期リンクをクリックすると、正確な動作をさらに定義するページに移動します。あなたはそのページ全体を読みたいかもしれません、それはそれほど長くはありません。同期の定義から2つのポイントを抜粋します

  1. ページング可能なホストメモリからデバイスメモリへの転送の場合、コピーが開始される前にストリーム同期が実行されます。デバイスメモリへのDMA転送のためにページング可能バッファがステージングメモリにコピーされると、関数は戻りますが、最終宛先へのDMAが完了していない可能性があります(強調を追加)

そして:

  1. デバイスからページング可能または固定されたホストメモリへの転送の場合、関数はコピーが完了したときにのみ戻ります。

あなたのコードは最初の抜粋(上記の項目2)に適合します。その転送タイプ(ホストからデバイス)は、コピーが完全に完了する前に戻る可能性があります

cudaMemcpyでポインタの順序を逆にして、コピーの方向を逆にすると、2番目の抜粋(上記の項目4)に分類されます。その場合、転送が完了することが保証され、実際にエラーレポートがコードから消えます。

この動作は可能であり、ドキュメントで説明されています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

カスタム動作とデフォルト動作の両方をトリガーするようにSublimeText 3マウスイベントを設定するにはどうすればよいですか?

分類Dev

デフォルトのクリック時の動作に追加の動作を追加するにはどうすればよいですか?

分類Dev

すべてのフォームリクエストの検証を無視するルールを作成するにはどうすればよいですか?

分類Dev

Excelでハイパーリンクのデフォルトのopen-with動作を変更するにはどうすればよいですか?

分類Dev

Djangoクエリで取得/フィルタリングするときにモデルのデフォルトの属性値を設定するマネージャークラスを作成するにはどうすればよいですか?

分類Dev

AWS CLIを使用するときにJMESPathクエリでnull値のデフォルト値を設定するにはどうすればよいですか?

分類Dev

Windowsでデスクトップのズームレベルをデフォルトにリセットするにはどうすればよいですか?

分類Dev

Enterキーを押したときに<inputtype = "time">のデフォルトの動作を無効にするにはどうすればよいですか?

分類Dev

nodejsリクエストのデフォルトのタイムアウト時間を変更するにはどうすればよいですか?

分類Dev

NodeJSのリクエストでフォームフィールドに配列をエンコードするにはどうすればよいですか?

分類Dev

Herokuでデフォルトのリクエストタイムアウトを変更するにはどうすればよいですか?

分類Dev

Visual Studio Codeを起動するときにデフォルトのワークスペースを開くにはどうすればよいですか?

分類Dev

デフォルトでテキストエリアのスクロールバーを下に設定するにはどうすればよいですか?

分類Dev

フォーク間でプルリクエストを実行できないので、変更を取得するにはどうすればよいですか?

分類Dev

1回のリクエストで複数のフォームからデータを送信するにはどうすればよいですか?

分類Dev

OpenVPNクライアントをUDPのみとデフォルト以外のポートで動作させるにはどうすればよいですか?

分類Dev

デフォルトのシグナル処理動作をトリガーするにはどうすればよいですか?

分類Dev

IDLEをPythonスクリプトのデフォルトエディタとして設定するにはどうすればよいですか?

分類Dev

IDLEをPythonスクリプトのデフォルトエディタとして設定するにはどうすればよいですか?

分類Dev

MonoTouchを使用してiOSのPOSTリクエストでフォームデータを送信するにはどうすればよいですか?

分類Dev

Wix#で、レジストリエントリのみを展開するときに、ターゲットシステムに物理フォルダーを作成しないようにするにはどうすればよいですか?

分類Dev

Wix#で、レジストリエントリのみを展開するときに、ターゲットシステムに物理フォルダーを作成しないようにするにはどうすればよいですか?

分類Dev

クリックしたときに入力のテキストが残るフォームを作成するにはどうすればよいですか?

分類Dev

ホームディレクトリのデフォルトのフォルダ名を変更するにはどうすればよいですか?

分類Dev

カスタムクリックアンドドラッグを角度で行うときに、デフォルトのカーソルスタイル(テキストセレクター)を無効にするにはどうすればよいですか?

分類Dev

GoogleフォームのJSスクリプトを取得するにはどうすればよいですか?

分類Dev

リストのリストをエクスポート用のデータフレームに変換するにはどうすればよいですか?

分類Dev

ターミナルを開くが、デフォルトのホームとは異なるディレクトリの下にあるデスクトップの「ショートカット」を作成するにはどうすればよいですか?

分類Dev

Android Studio:デフォルトのカーソルスタイルと動作を変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    カスタム動作とデフォルト動作の両方をトリガーするようにSublimeText 3マウスイベントを設定するにはどうすればよいですか?

  2. 2

    デフォルトのクリック時の動作に追加の動作を追加するにはどうすればよいですか?

  3. 3

    すべてのフォームリクエストの検証を無視するルールを作成するにはどうすればよいですか?

  4. 4

    Excelでハイパーリンクのデフォルトのopen-with動作を変更するにはどうすればよいですか?

  5. 5

    Djangoクエリで取得/フィルタリングするときにモデルのデフォルトの属性値を設定するマネージャークラスを作成するにはどうすればよいですか?

  6. 6

    AWS CLIを使用するときにJMESPathクエリでnull値のデフォルト値を設定するにはどうすればよいですか?

  7. 7

    Windowsでデスクトップのズームレベルをデフォルトにリセットするにはどうすればよいですか?

  8. 8

    Enterキーを押したときに<inputtype = "time">のデフォルトの動作を無効にするにはどうすればよいですか?

  9. 9

    nodejsリクエストのデフォルトのタイムアウト時間を変更するにはどうすればよいですか?

  10. 10

    NodeJSのリクエストでフォームフィールドに配列をエンコードするにはどうすればよいですか?

  11. 11

    Herokuでデフォルトのリクエストタイムアウトを変更するにはどうすればよいですか?

  12. 12

    Visual Studio Codeを起動するときにデフォルトのワークスペースを開くにはどうすればよいですか?

  13. 13

    デフォルトでテキストエリアのスクロールバーを下に設定するにはどうすればよいですか?

  14. 14

    フォーク間でプルリクエストを実行できないので、変更を取得するにはどうすればよいですか?

  15. 15

    1回のリクエストで複数のフォームからデータを送信するにはどうすればよいですか?

  16. 16

    OpenVPNクライアントをUDPのみとデフォルト以外のポートで動作させるにはどうすればよいですか?

  17. 17

    デフォルトのシグナル処理動作をトリガーするにはどうすればよいですか?

  18. 18

    IDLEをPythonスクリプトのデフォルトエディタとして設定するにはどうすればよいですか?

  19. 19

    IDLEをPythonスクリプトのデフォルトエディタとして設定するにはどうすればよいですか?

  20. 20

    MonoTouchを使用してiOSのPOSTリクエストでフォームデータを送信するにはどうすればよいですか?

  21. 21

    Wix#で、レジストリエントリのみを展開するときに、ターゲットシステムに物理フォルダーを作成しないようにするにはどうすればよいですか?

  22. 22

    Wix#で、レジストリエントリのみを展開するときに、ターゲットシステムに物理フォルダーを作成しないようにするにはどうすればよいですか?

  23. 23

    クリックしたときに入力のテキストが残るフォームを作成するにはどうすればよいですか?

  24. 24

    ホームディレクトリのデフォルトのフォルダ名を変更するにはどうすればよいですか?

  25. 25

    カスタムクリックアンドドラッグを角度で行うときに、デフォルトのカーソルスタイル(テキストセレクター)を無効にするにはどうすればよいですか?

  26. 26

    GoogleフォームのJSスクリプトを取得するにはどうすればよいですか?

  27. 27

    リストのリストをエクスポート用のデータフレームに変換するにはどうすればよいですか?

  28. 28

    ターミナルを開くが、デフォルトのホームとは異なるディレクトリの下にあるデスクトップの「ショートカット」を作成するにはどうすればよいですか?

  29. 29

    Android Studio:デフォルトのカーソルスタイルと動作を変更するにはどうすればよいですか?

ホットタグ

アーカイブ