0

cudaMalloc非同期であるにもかかわらず、呼び出されたときにスレッドが生成されたようです。これは、 を使用したデバッグ中に観察されましcuda-gdbた。 新しいスレッドを生成する alloc_mem_GPU 内で cudaMalloc が呼び出されました

戻るのにも時間がかかりました。

プログラムの最後で、同じスレッドが別の LWP として終了しました。

誰かがこの動作を説明できますか?

4

1 に答える 1

2

スレッドは によって特に生成されませんcudaMalloc。ユーザー側の CUDA ドライバー API ライブラリは、CUDA コンテキストの有効期間を持つ遅延コンテキスト設定中のある段階でスレッドを生成するようです。正確なプロセスは公開されていません。

これが関連付けられていることがわかりますcudaMalloc。これは、ユーザー空間ドライバーのサポートを機能させるために必要なセットアップ/コールバックをトリガーする最初の API であると推測できるからです。最初の呼び出しだけがスレッドを生成することに注意してください。後続の呼び出しはしません。また、スレッドは CUDA コンテキストの存続期間中存続し、その後終了します。cudaDeviceResetプログラム実行の任意の時点で呼び出すことにより、明示的なスレッドの破棄をトリガーできます。

cudaMemcpyToSymbolではなく、ドライバー API ライブラリからスレッド生成をトリガーする簡単な例を次に示しcudaMallocます。

__device__ float someconstant;

int main()
{
    cudaSetDevice(0);
    const float x = 3.14159f;
    cudaMemcpyToSymbol(someconstant, &x, sizeof(float));
    for(int i=0; i<10; i++) {
        int *x;
        cudaMalloc((void **)&x, size_t(1024));
        cudaMemset(x, 0, 1024);
        cudaFree(x);
    }
    return int(cudaDeviceReset());
}

gdb では、次のように表示されます。

(gdb) tbreak main
Temporary breakpoint 1 at 0x40254f: file gdb_threads.cu, line 5.
(gdb) run
Starting program: /home/talonmies/SO/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Temporary breakpoint 1, main () at gdb_threads.cu:5
5       cudaSetDevice(0);
(gdb) next
6       const float x = 3.14159f;
(gdb) next
7       cudaMemcpyToSymbol(someconstant, &x, sizeof(float));
(gdb) next
[New Thread 0x7ffff5eb5700 (LWP 14282)]
[New Thread 0x7fffed3ff700 (LWP 14283)]
8       for(int i=0; i<10; i++) {
(gdb) info threads
  Id   Target Id         Frame 
  3    Thread 0x7fffed3ff700 (LWP 14283) "a.out" pthread_cond_timedwait@@GLIBC_2.3.2 ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238
  2    Thread 0x7ffff5eb5700 (LWP 14282) "a.out" 0x00007ffff74d812d in poll () at ../sysdeps/unix/syscall-template.S:81
* 1    Thread 0x7ffff7fd1740 (LWP 14259) "a.out" main () at gdb_threads.cu:8

(gdb) thread apply all bt

Thread 3 (Thread 0x7fffed3ff700 (LWP 14283)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238
#1  0x00007ffff65cad97 in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#2  0x00007ffff659582d in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#3  0x00007ffff65ca4d8 in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#4  0x00007ffff79bc182 in start_thread (arg=0x7fffed3ff700) at pthread_create.c:312
#5  0x00007ffff74e547d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

Thread 2 (Thread 0x7ffff5eb5700 (LWP 14282)):
#0  0x00007ffff74d812d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007ffff65c9953 in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#2  0x00007ffff66571ae in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#3  0x00007ffff65ca4d8 in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1
#4  0x00007ffff79bc182 in start_thread (arg=0x7ffff5eb5700) at pthread_create.c:312
#5  0x00007ffff74e547d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

Thread 1 (Thread 0x7ffff7fd1740 (LWP 14259)):
#0  main () at gdb_threads.cu:8
于 2016-05-30T07:59:16.273 に答える