-1
A C++标准库用下面的代码(忽略各种包装和概念支票等的)与简单的循环实现std::copy
:通用翘曲级的std ::复制般的功能 - 什么是应该考虑?
for (; __first != __last; ++__result, ++__first)
*__result = *__first;
现在,假设我想的通用为经线std::copy
样函数(未块;不栅极)以用于协作从一个地方将数据复制到另一个。为了简单起见,我们甚至假设函数使用指针而不是任意的迭代器。
当然,在CUDA中编写通用代码通常是一种无用的追求 - 因为我们可能首先牺牲了使用GPU的许多优势,以支持通用性 - 所以我会允许我自己布尔/枚举模板参数以可能频繁出现的情况之间选择,避免运行时检查。所以签名可能是,说:
template <typename T, bool SomeOption, my_enum_t AnotherOption>
T* copy(
T* __restrict__ destination,
const T* __restrict__ source,
size_t length
);
但对于每一种情况下我的目标以获得最佳性能(或因为我们不知道还有什么其他的经纱在做最佳预期的性能)。
写这样的功能时,我应该采取哪些因素考虑?或者换句话说:我应该在实施这个功能时区分哪些情况?
注:
- 这应该针对计算能力3.0或更高(即开普勒或更新微架构)
- 我不想做一个运行时API调用
memcpy()
。至少,我不认为我这样做。
不此[存在](https://nvlabs.github.io/cub/group___u til_io.html)? – talonmies
@talonmies:我不这么认为;那些CUB功能/方法用于将数据加载到分解/展开/条纹/等等。形式。其中一些是块级的。但是,我认为这是一个很好的去寻找灵感的地方。 – einpoklum