首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我可以在不传递指针数组的情况下启动协作内核吗?

我可以在不传递指针数组的情况下启动协作内核吗?
EN

Stack Overflow用户
提问于 2018-01-31 08:53:27
回答 3查看 1.2K关注 0票数 4

CUDA运行时API允许我们使用变量数参数三元雪佛龙语法启动内核:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my_kernel<<<grid_dims, block_dims, shared_mem_size>>>(
    first_arg, second_arg, and_as_many, as_we, want_to, etc, etc);

但是关于“协作”内核,数据自动化系统编程指南说(第C.3节):

为了启用网格同步,在启动内核时,必须使用cuLaunchCooperativeKernel CUDA运行时启动API,而不是使用cuLaunchCooperativeKernel执行配置语法: cudaLaunchCooperativeKernel( const *func,dim3 gridDim,dim3 blockDim,void **args,size_t sharedMem = 0,cudaStream_t stream =0)(或相当于CUDA驱动程序)。

我宁愿不必为构建指针数组编写自己的包装代码..。运行时API中真的没有避免这种情况的工具吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-01 02:08:37

我们可以使用以下解决方法(需要--std=c++11或最新的C++语言标准):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace detail {

template <typename F, typename... Args>
void for_each_argument_address(F f, Args&&... args) {
    [](...){}((void)(f( (void*) &std::forward<Args>(args) ), 0)...);
}

} // namespace detail

template<typename KernelFunction, typename... KernelParameters>
inline void cooperative_launch(
    const KernelFunction&       kernel_function,
    stream::id_t                stream_id,
    launch_configuration_t      launch_configuration,
    KernelParameters...         parameters)
{
    void* arguments_ptrs[sizeof...(KernelParameters)];
    auto arg_index = 0;
    detail::for_each_argument_address(
        [&](void * x) {arguments_ptrs[arg_index++] = x;},
        parameters...);
    cudaLaunchCooperativeKernel<KernelFunction>(
        &kernel_function,
        launch_configuration.grid_dimensions,
        launch_configuration.block_dimensions,
        arguments_ptrs,
        launch_configuration.dynamic_shared_memory_size,
        stream_id);
}

注意:这使用for_each_arg()一行程序.另见关于它的这篇文章 at FluentCPP

票数 4
EN

Stack Overflow用户

发布于 2018-05-31 18:06:23

FWIW您可以通过void传递任意结构(在API文档中不是很明显)。在这种情况下,编译器从函数签名中计算出的大小并不明显,并且适当的大小被复制到内核中。API文档似乎没有详细说明这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Param { int a, b; void* device_ptr; };
Param param{aa, bb, d_ptr};
void *kArgs = {&param};
cudaLaunchCooperativeKernel(..., kArgs, ...);
票数 4
EN

Stack Overflow用户

发布于 2018-02-01 02:14:57

答案是否定的。

在遮罩下,<<< >>>语法将按如下方式展开:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deviceReduceBlockKernel0<<<nblocks, 256>>>(input, scratch, N);

变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(cudaConfigureCall(nblocks, 256)) ? (void)0 : deviceReduceBlockKernel0(input, scratch, N); 

然后发出一个样板包装函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void deviceReduceBlockKernel0(int *in, int2 *out, int N) ;

// ....

void deviceReduceBlockKernel0( int *__cuda_0,struct int2 *__cuda_1,int __cuda_2)
{
__device_stub__Z24deviceReduceBlockKernel0PiP4int2i(_cuda_0,__cuda_1,__cuda_2);
}

void __device_stub__Z24deviceReduceBlockKernel1P4int2Pii( struct int2 *__par0,  int *__par1,  int __par2) 
{  
    __cudaSetupArgSimple(__par0, 0UL); 
    __cudaSetupArgSimple(__par1, 8UL); 
    __cudaSetupArgSimple(__par2, 16UL); 
    __cudaLaunch(((char *)((void ( *)(struct int2 *, int *, int))deviceReduceBlockKernel1))); 
}

即。当您显式地使用内核启动API(无论是常规的单一启动API还是新的协作启动API)时,工具链只是自动地在代码中手工(或通过花哨的生成器模板)完成您必须做的事情。在不推荐的API版本中,有一个内部堆栈为您执行脏工作。在较新的API中,您自己创建参数数组。同样的事情,只是不同的狗粮。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48547409

复制
相关文章
Java|屏幕截图
初入java,想用java来实现游戏脚本功能,但是奈何刚刚入门。于是我就将其分为了几个板块:1屏幕截图,2图片比对获取关键坐标,3对关键坐标进行操作。
算法与编程之美
2020/07/28
2.3K0
Java|屏幕截图
Android屏幕截图,View截图(干货)
作者:冰点k https://www.jianshu.com/p/4ae6b8c7bd60 不多说废话,直接上代码 屏幕截图,亲测可用,基于Activity /** * 屏幕截图 * @param activity * @return */ public static Bitmap screenShot(AppCompatActivity activity,String filePath) { if (activity == null){
前端教程
2018/08/16
2.1K0
WordPress 技巧:使用页面模板自定义 WordPress 页面
默认情况下 WordPress 是使用 page.php 来处理所有页面的外观的话,但是 WordPress 提供了页面模板的机制让 WordPress 开发者可以自定义 WordPress 每个页面的外观和布局。
Denis
2023/04/15
1.3K0
WordPress 初学者词汇表(术语解释)
WordPress.com是由 Automattic(发明 WordPress 的开发人员)运营的在线平台,您可以在其中免费创建基本博客(尽管您可以注册高级计划)。WordPress.com 的问题在于,您的网站在技术上由 Automattic 拥有和管理,而在网站的功能和设计方面,您的选择有限。
帝旭科技
2022/11/23
7.3K0
WordPress 初学者词汇表(术语解释)
Appium 屏幕截图方法
在实际自动化项目运行过程中,很多时候App可以会出现各种异常,为了更好的定位问题,除了捕捉日志我们还需要对运行时的设备状态来进行截屏。从而达到一种“有图有真相”的效果。
清风穆云
2021/08/09
2.1K0
Qt快捷屏幕截图
介绍两种Qt屏幕截图的方法。 方法1 接口: QPixmap QScreen::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1) 示例: QScreen *screen =
Qt君
2019/07/22
1.9K0
WordPress 技巧:创建博客作者页面
根据 WordPress 模板结构,WordPress 会使用 author.php 文件,如果没有,就会使用 archive.php 文件,如果还是没有,最后就会使用 index.php 文件来显示博客的某个作者的文章列表。
Denis
2023/04/15
4260
WordPress 数据库详解
WordPress 数据库为您的 WordPress 网站提供了基础。没有数据库,您的 WordPress 网站根本无法运行。WordPress 数据库支持您的网站加载和运行,并存储和保存您博客的内容,例如帖子和评论,以及您(甚至您的访问者)所做的更改。
白黎
2023/03/16
5.5K0
WordPress 数据库详解
增加MATLAB屏幕截图功能
借助Java或者Python实现截取屏幕指定矩形区域 Java实现 function outputImage=screenCapture(subRegion,outputFile) robo = java.awt.Robot; if ~exist('subRegion','var') || isempty(subRegion) %获取屏幕尺寸 t = java.awt.Toolkit.getDefaultToolkit(); rectangle = java.awt.Rectangl
万木逢春
2019/04/30
1.7K0
WordPress 6.1 正式版已发布,最全新功能图文介绍
WordPress 6.1 正式版已发布,这是 2022 年的最后一个主要版本,带来许多新功能和改进。今天,WordPress大学分享下来自 WPBeginner 的文章,详细介绍WordPress 6.1的新功能。
帝旭科技
2022/11/23
4.7K0
WordPress 6.1 正式版已发布,最全新功能图文介绍
WordPress SEO:配置Yoast和添加内容目录
这是我们可以在页面SEO上做的其中一些事情。本系列教程我将介绍丰富的摘录,介绍Google精选摘录,速度优化,图像优化,点击率,本地SEO,以及为什么总是迷恋Yoast绿灯不好,因为它可能会引起关键字堆砌问题。下面文章中所有屏幕截图都是最新的,如果不是请加微信lcd1378告诉我!
林雍岷
2019/11/05
1.5K0
WordPress SEO:配置Yoast和添加内容目录
cocos3.8屏幕截图
立羽
2023/08/24
2400
Snagit for mac(屏幕截图和屏幕录制工具)
Snagit是一款由TechSmith公司开发的屏幕截图和屏幕录制工具,旨在帮助用户在Mac OS X平台上捕捉和编辑屏幕内容。Snagit可以快速捕捉全屏、窗口、区域或滚动屏幕截图,并提供多种编辑工具,如裁剪、调整大小、添加文本、箭头、形状、高亮、马赛克和数字等标记。此外,Snagit还支持屏幕录制,可以捕捉视频、音频和鼠标点击等操作,并进行编辑和导出。Snagit已经成为许多行业中使用的标准工具,包括软件开发、技术支持、教育、医疗保健、市场营销和在线培训等领域。
快乐的小丸子
2023/03/28
3.1K0
安卓禁止屏幕截图
讲述生活则声音没有不和谐的。——英国诗人柯尔律治 只需要一行代码即可 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); 然后打开APP,在当前activity就没法截图了
阿超
2022/08/16
9420
安卓禁止屏幕截图
Qt官方示例-屏幕截图
https://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-example.html
Qt君
2020/07/07
2.1K0
自定义WordPress后台登录页面
如果你看腻了 wordpress 默认登录界面,或者想将 WordPress 的 logo 替换为自己网站 logo,并改变其外观,可以参考此文,打造一个个性化的登录页面。
许都博客
2021/06/16
1K0
如何在 WordPress 中创建登录页面
登陆页面: 登陆页面是为特定受众制定的具有特定目标的目标页面,可以描述为“一页一目的”。登陆页面必须有一个“号召性用语”,并牢记特定目标。成功的着陆页是具有更高转化率、更高参与度和更高质量潜在客户的页面。
海拥
2022/10/04
2.9K0
如何在 WordPress 中创建登录页面
WordPress 教程:创建多人博客作者页面
根据前面的 WordPress 技巧:创建博客作者页面 的介绍,今天咱们来完成一个适合多人博客的作者存档页面。可以显示作者的网站,邮箱和个人履历等这些资料,让读者更多地了解这个作者。
Denis
2023/04/15
3420
盘点2020年wordpress常用的50个插件合集-吐血推荐
盘点2020年wordpress常用的50个插件合集,50个插件已经打包整理好,可以选择性安装或者是去搜索添加。如果后台经常出现安装不成功的!大部分的插件是可以在网上搜到的或者是在wordpress后台搜索添加。
wordpress建站吧
2020/06/17
5.5K0
点击加载更多

相似问题

WordPress自定义帖子类型管理页面布局

10

Wordpress -创建自定义帖子类型的管理消息

10

Wordpress自定义帖子类型页面

11

WordPress自定义帖子类型管理UI

13

如何从我的自定义帖子类型管理屏幕中删除所有Wordpress帖子?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文