表达式模板+ CRTP + AMP ==内核生成

问题描述 投票:1回答:1

我最近发现表达模板非常棒,并且在使用中达到了一些令人满意的理解和技能水平,但是我想对这个成语进行新的使用。我会跳过关于我是如何解决这个问题的冗长故事,但这个问题在价值方面证明了自己。

我试图创建类似于wiki上的基本表达式类,但是在C ++ AMP兼容形式中,这意味着操作都是在C ++ AMP内核中完成的。人们可以轻松地将包装类编写到这样的大型向量操作中,这些操作将每个基本操作作为单独的内核,但这是非常低效的。我正在尝试创建包装表达式模板类,最终将操作合并到单个内核中。

给定wiki上的示例代码,这意味着在Vec类的复制构造函数中,人们会写

concurrency::parallel_for_each(vec.get_extent(), [&](index_type i) restrict(amp,cpu) {...});

而不是常规的for循环。唯一的问题是,内部限制(放大器)功能,人们只能使用与放大器兼容的类,这些类具有C++AMP specification第2节中描述的限制,最重要的是在2.4节中。最大的限制是C ++ AMP兼容类除了concurrency :: array之外不能有引用成员。这完全破坏了表达式Tempalte习惯用法(可能在这里使用了错误的单词),其中操作被打包到彼此中,并且它们都保存对内部操作数的引用。按值存储AFAIK也不是一种选择,因为编译器只能“查看”没有(const)引用之外的成员的类。

有没有办法让这项工作,或找到一个完全主机端C ++的替代路由,并在稍后的所有部分转换为C ++ AMP兼容的构造?最后,我希望能够创建包装类,没有任何GPGPU知识的人可以高效地使用,而不必创建代码生成工具,而不是让编译器完成所有的工作。

提前致谢。

ps。:自然index_type是concurrency :: index <1>,container_type是concurrency :: array或concurrency :: array_view,无论哪个有助于解决问题。 array_view逻辑上更清晰,这意味着Vec类是使用类外部的数组创建的,而Vec只将array_views存储到该数组中,但是array_views不允许作为任何形式的引用成员,加上逻辑数组应该允许更多的优化编译器,而不是让每个操作在不同的array_views上运行,这可能实际上指向同一物理阵列。

c++ crtp expression-templates
1个回答
0
投票

如果有人遇到这个高度过时的问题,我找到了解决最初问题的方法。

可以使用值语义并使用array_view实例来引用数据,而不是使用const array&,而不是使用具有引用语义的表达式模板。

© www.soinside.com 2019 - 2024. All rights reserved.