初识CUDAGPU线程的调用

简介: 初识CUDAGPU线程的调用

正如talonmies所说,

将其调用放入lambda函数

auto myFunc = [&](){

cudaStream_t stream2;

cudaSetDevice(device2);

cudaStreamCreate (&stream2);

vectorAdd_gpu <<>>(s.a1, s.a2, s.a2, s.flag);

cudaStreamSynchronize(stream2);

cudaStreamDestroy(stream2);

};

然后把它交给线程 .

thread t2(myFunc);

t2.join();

但是,除此之外,您仍然可以在CPU工作中异步使用应用程序的相同主线程 . 我只是展示了你想看到的东西 . 异步使用相同的线程可能比重新创建流和重新连接线程更有效,具体取决于工作的大小 . 也许重新加入比在这里同步和启动内核有更多的开销 . 你每秒进行多少次内核调用?

for (int i = 0; i < nStreams; ++i) {

int offset = i * streamSize;

cudaMemcpyAsync(&d_a[offset], &a[offset],

streamBytes, cudaMemcpyHostToDevice, cudaMemcpyHostToDevice, stream[i]);

}

for (int i = 0; i < nStreams; ++i) {

int offset = i * streamSize;

kernel<<>>(d_a, offset);

}

for (int i = 0; i < nStreams; ++i) {

int offset = i * streamSize;

cudaMemcpyAsync(&a[offset], &d_a[offset],

streamBytes, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToHost, stream[i]);

}

这只是进行异步流重叠的不同方法之一 .

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
调度
线程都有哪些方法?
线程都有哪些方法?
60 0
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
80 6
多线程之Thread类常见方法及线程的状态
多线程之Thread类常见方法及线程的状态
|
Java API 调度
线程的创建和使用
线程的创建和使用
59 0
|
自然语言处理 算法 Linux
线程执行 Q&A
线程执行 Q&A
79 0
|
开发框架 Java .NET
干货分享:详解线程的开始和创建
干货分享:详解线程的开始和创建
107 0
干货分享:详解线程的开始和创建
|
搜索推荐 Java Python
一日一技:等待多个线程同时结束的两种方法
一日一技:等待多个线程同时结束的两种方法
362 0
|
监控
线程 - 带返回值的多线程
线程 - 带返回值的多线程
205 0
|
Linux 调度 Android开发
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
339 0