cudaMalloc
は、非同期であっても、呼び出されたときにスレッドを生成したようです。これは、デバッグ中にcuda-gdb
を使用して確認されました。 cudaMallocによって生成された新しいスレッド|動作?
また戻ってきました。
同じスレッドが、プログラムの最後に別のLWPとして終了しましたが、終了しました。
誰かがこの現象を説明できますか?
cudaMalloc
は、非同期であっても、呼び出されたときにスレッドを生成したようです。これは、デバッグ中にcuda-gdb
を使用して確認されました。 cudaMallocによって生成された新しいスレッド|動作?
また戻ってきました。
同じスレッドが、プログラムの最後に別のLWPとして終了しましたが、終了しました。
誰かがこの現象を説明できますか?
スレッドは、具体的にはcudaMalloc
によって生成されません。ユーザーサイドのCUDAドライバAPIライブラリは、遅延コンテキストのセットアップ中にCUDAコンテキストの存続期間を持つスレッドを生成するようです。正確なプロセスは公開されていません。
cudaMalloc
と関連付けられています。これは、ユーザー空間ドライバのサポートを行うために必要なセットアップ/コールバックを起動する最初のAPIだと思います。最初の呼び出しだけがスレッドを生成することに注意してください。それ以降の呼び出しは行いません。また、スレッドはCUDAコンテキストの存続期間中は生き残り、その後は終了します。プログラム実行の任意の時点でcudaDeviceReset
を呼び出すことによって、明示的なスレッドの破棄をトリガーできます。ここで
ではなくcudaMalloc
よりも、ドライバのAPIライブラリから産卵スレッドをトリガcudaMemcpyToSymbol
を示して簡単な例です:
__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());
}
私はこれを参照してください。それは_lazy_でどのように
(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" [email protected]@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 [email protected]@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
をセットアップ ?スレッドはすぐに生成されませんか? – kesari
なぜこれがコミュニティウィキになったのですか? – kesari
@kesari:コンテキスト作成( 'cudaSetDevice'呼び出し)は、コンテキストがその時点でライブであってもスレッドを生成しないため、遅延です。スレッドを必要とする操作が呼び出され、それらが生成されるときだけです。最近の私の回答はすべてコミュニティwikiの回答です。それは私が貢献することを選択する方法です。 – talonmies