While profiling my CUDA application with NVIDIA Visual Profiler, I saw that the cudaStream synchronization After any operation, all the streams have expired, this is very strange behavior because if cudaStream synchronizes gives it means that the stream is finished, right? Here's my fax code: std :: list & lt; Std :: thread & gt; waitingThreads; Zero StartKernelSync (for {{int i = 0; i <200; ++ i} {KoodhostAllok (CPUPid Memory, Size, KoodhostAllow Default); Memcpy (cpuPinnedMemory, Data, Size); CudaMalloc (gpuMemory); CudaStreamCreate (& amp; stream); CudaMemcpyAynync (gpuMemory, cpuPinnedMemory, size, cudaMemcpyHostToDevice, stream); RunCernel & lt; & Lt; & Lt; 32, 32, 0, stream & gt; & Gt; & Gt; (GPU Memorial); CudaMemcpyAsync (cpuPinnedMemory, gpuMemory, Size, cudaMemcpyDeviceToHost, Stream); WaitingThreads.push_back (std :: move (std :: thread (waitForFinish, cpuPinnedMemory, stream))); } While (Waiting Streads.) () & Gt; 0)