- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
由于 Thrust 库存在一些性能问题(有关详细信息,请参阅 this page),我计划重构一个 CUDA 应用程序以使用 CUB 而不是 Thrust。具体来说,就是替换 thrust::sort_by_key 和 thrust::inclusive_scan 调用)。在我的应用程序的特定点上,我需要按键对 3 个数组进行排序。这就是我用推力做到这一点的方式:
thrust::sort_by_key(key_iter, key_iter + numKeys, indices);
thrust::gather_wrapper(indices, indices + numKeys,
thrust::make_zip_iterator(thrust::make_tuple(values1Ptr, values2Ptr, values3Ptr)),
thrust::make_zip_iterator(thrust::make_tuple(valuesOut1Ptr, valuesOut2Ptr, valuesOut3Ptr))
);
在哪里
key iter
是一个 thrust::device_ptr,它指向我要排序的键indices
指向设备内存中的一个序列(从 0 到 numKeys-1)values{1,2,3}Ptr
是我要排序的值的 device_ptrvalues{1,2,3}OutPtr
是排序值的 device_ptr随着CUB SortPairs功能我可以对单个值缓冲区进行排序,但不能一次性对所有 3 个进行排序。问题是我没有看到任何 CUB“类似收集”的实用程序。有什么建议吗?
编辑:
我想我可以实现自己的 gather 内核,但是除了以下方法还有其他更好的方法吗:
template <typename Index, typename Value>
__global__ void gather_kernel(const unsigned int N, const Index * map,
const Value * src, Value * dst)
{
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < N)
{
dst[i] = src[map[i]];
}
}
非合并的加载和存储让我感到畏缩,但如果 map
上没有已知结构,这可能是不可避免的。
最佳答案
看来你想要实现的目标取决于thrust::zip_iterator
.你也可以
thrust::sort_by_key
通过 cub::DeviceRadixSort::SortPairs
并保持 thrust::gather
, 或values{1,2,3}
在使用 cub::DeviceRadixSort::SortPairs
之前进入结构数组看完thrust::gather
的执行后,
$CUDA_HOME/include/thrust/system/detail/generic/gather.inl
你可以看到它只是一个朴素的内核
__global__ gather(int* index, float* in, float* out, int len) {
int i=...;
if (i<len) { out[i] = in[index[i]]; }
}
然后我认为你上面的代码可以用一个内核替换而不需要太多努力。
在此内核中,您可以首先使用 CUB block 大小原语 cub::BlockRadixSort<...>::SortBlockedToStriped
获取存储在寄存器中的排序索引,然后执行天真的重新排序拷贝作为 thrust::gather
填写values{1,2,3}Out
.
使用 SortBlockedToStriped
而不是 Sort
复制 values
时可以合并写入(虽然不是为了阅读) .
关于c++ - CUB (CUDA UnBound) 相当于 thrust::gather,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210652/
参数说明 以官方说明为例,gather()函数需要三个参数,输入input,维度dim,以及索引index input必须为Tensor类型 dim为int类型,代表从哪个维度进行索引 in
我知道如何在 melt 中使用两个 id.vars .这很简单: x = data.frame(subject = c("John", "Mary"), time = c
我正在尝试使用 gather在 tidyr包,但我无法从默认名称更改输出的列名称。例如: df = data.frame(time = 1:100,a = 1:100,b = 101:200) df.
为什么 asyncio.gather 不适用于生成器表达式? import asyncio async def func(): await asyncio.sleep(2) # Works a
我想整理一些不幸的是在前两行中设置了两个列标题的数据: 第一行(标题):实际上是度量的类型(例如。估计、标准误差、上限、下限)。 第二行(也是标题):是度量的年份。 有什么方法可以使用gather()
当我添加 NuGet 包(最新版本的 NuGet 和 Visual Studio 2015)时,它在安装包之前在“尝试收集依赖项”处挂起大约 5 分钟。我可以指向 NuGet.org、我们的内部服务器
我想在 melt 中指定输出列的类别(或 gather)。我想为所有列和不同的类做这件事。 例如,我有一些数据: example example day max min 1 1 20
我有一个按地区进行满意度调查的结果数据集。调查中的每个问题都采用 4 分制评分(从非常满意到非常不满意)。数据集中的每一行都包含给定“财政年度”结束时给定区域中给定问题的汇总结果。它还包含每个级别的受
键排序是否取决于我是否首先列出要收集的列与不收集的列? 这是我的数据框: library(tidyr) wide_df <- data.frame(c("a", "b"), c("oh", "ah")
我见过asyncio.gather vs asyncio.wait ,但不确定这是否解决了这个特定问题。我想做的是将 asyncio.gather() 协程包装在 asyncio.wait_for()
我正在尝试了解 AVX2 intel intrinsic 的收集功能。 根据官方文档Link ,函数定义为, __m256i _mm256_i32gather_epi32 (int const* ba
首先,我一直在使用 this code作为引用,它显示了不使用 MPI_Scatter 的 MPI_Gather 的使用,因为这就是我在这里想要实现的目标。我已经为此工作了很长时间,只是无法弄清楚这个
我正在使用 MPI 开发 mandelbrot 生成器,它在完成时输出 PPM 文件。我使用 MPI gather 将计算结果 block 收集到最终数组中。代码生成文件但不完整;仅显示图片的上半部分
我正在使用 R 将宽格式数据表转换为长格式。它有效,除了必须为新列使用变量: library(readr) library(tidyr) files <- Sys.glob("sources/*.cs
使用 Python 3.7,我试图捕获异常并通过 following an example I found on StackOverflow 重新引发它.虽然该示例确实有效,但它似乎并不适用于所有情况
我有一个数据框,看起来像下面“输入”中显示的图片。 我尝试每行获取 1 个日期(请参见下面“所需输出”中的图片)。换句话说,我尝试为每一行做一种“转置”。 让我们规定组合 'LC' 和 'Prod'
我正在尝试使用索引张量对张量进行切片。为此,我尝试使用 tf.gather . 但是,我很难理解 documentation并且不要让它像我期望的那样工作: 我有两个张量。安 activations形
我想 gather() 列出列以在我的数据框中创建新行。我正在使用 repurrrsive 包中的《权力的游戏》数据集。下面是我设置问题的代码: library(tidyverse) got_char
我想有条件地运行异步函数,如下所示: one, two, three = await asyncio.gather( some_async_method1(), some_async_
我正在使用tensorflow的tf.gather从多维数组中获取元素,如下所示: import tensorflow as tf indices = tf.constant([0, 1, 1]) x
我是一名优秀的程序员,十分优秀!