合肥龙岗医院网站建设,一个网站如何做cdn加速,公司名称 网站域名 关联,互联网行业是做什么的1. 流的定义
流#xff08;Stream#xff09;是一个基于上下文#xff08;Context#xff09;的任务管道抽象#xff0c;是一组由GPU依次执行的CUDA操作序列#xff0c;其中每个操作可能会使用或产生数据。在一个上下文中可以创建多个流#xff0c;每个流都拥有自己的任…1. 流的定义
流Stream是一个基于上下文Context的任务管道抽象是一组由GPU依次执行的CUDA操作序列其中每个操作可能会使用或产生数据。在一个上下文中可以创建多个流每个流都拥有自己的任务队列和执行状态。通过在不同的流上执行不同的CUDA操作可以使得这些操作能够异步地并行执行提高了CUDA程序的性能。
默认情况下每个线程都有自己的默认流可以使用nullptr来代表默认流。在默认流上执行的CUDA操作会被添加到默认流的任务队列中然后在GPU上异步执行。如果您创建了多个流则需要使用流的句柄来将CUDA操作添加到特定的流中。
2. 同步和异步
2.1 同步
女朋友(context)发出指令(任务队列)后就什么事情都不能干了还要等我们这些工具人返回消息身为一个合格的工具人你们觉得这样可以吗身为工具人之王我们当然不能这样
2.2 异步
这个案例是一个流也就是一个男朋友当然漂亮的女生是应该被更好的对待例如说多个男朋友
女朋友难道要等我们工具人买回来全部东西吗 当然不用了女朋友可以不停的给我们发指令她想吃苹果了突然她又想吃个西瓜也给我们发一下突然她又想喝奶茶了再喊我们去给她买奶茶然后一次性叫我们拿回来
如果女朋友想知道买的奶茶的信息她完全可以给我们发个消息到了奶茶店给她拍一下今天有什么特别新品等等等等。
是女朋友也可以新建一个流这个流就是我的好兄弟工具人二号
最重要的是我们都不是她的男朋友我只是觉得我是她的男朋友 也就是nullptr, 默认流但是很可能我是异步的任务队列只是为了异步的执行操作提高context的管理而已
活没干完之前舔狗不许回家
3. 正常的解释 4. 代码案例
// CUDA运行时头文件
#include cuda_runtime.h#include stdio.h
#include string.h#define checkRuntime(op) __check_cuda_runtime((op), #op, __FILE__, __LINE__)bool __check_cuda_runtime(cudaError_t code, const char* op, const char* file, int line){if(code ! cudaSuccess){ const char* err_name cudaGetErrorName(code); const char* err_message cudaGetErrorString(code); printf(runtime error %s:%d %s failed. \n code %s, message %s\n, file, line, op, err_name, err_message); return false;}return true;
}int main(){int device_id 0;checkRuntime(cudaSetDevice(device_id));cudaStream_t stream nullptr;checkRuntime(cudaStreamCreate(stream));// 在GPU上开辟空间float* memory_device nullptr;checkRuntime(cudaMalloc(memory_device, 100 * sizeof(float)));// 在CPU上开辟空间并且放数据进去将数据复制到GPUfloat* memory_host new float[100];memory_host[2] 520.25;checkRuntime(cudaMemcpyAsync(memory_device, memory_host, sizeof(float) * 100, cudaMemcpyHostToDevice, stream)); // 异步复制操作主线程不需要等待复制结束才继续// 在CPU上开辟pin memory,并将GPU上的数据复制回来 float* memory_page_locked nullptr;checkRuntime(cudaMallocHost(memory_page_locked, 100 * sizeof(float)));checkRuntime(cudaMemcpyAsync(memory_page_locked, memory_device, sizeof(float) * 100, cudaMemcpyDeviceToHost, stream)); // 异步复制操作主线程不需要等待复制结束才继续printf(%f\n, memory_page_locked[2]);checkRuntime(cudaStreamSynchronize(stream));printf(%f\n, memory_page_locked[2]);// 释放内存checkRuntime(cudaFreeHost(memory_page_locked));checkRuntime(cudaFree(memory_device));checkRuntime(cudaStreamDestroy(stream));delete [] memory_host;return 0;
}