问题标签 [cub]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1455 浏览

arrays - CUDA 减少了许多大小不等的小型阵列

我想知道是否有人可以建议计算CUDA中大量相对较小但大小不同的数组的均值/标准偏差的最佳方法?

SDK中的并行缩减示例适用于单个非常大的数组,看起来大小方便地是每个块的线程数的倍数,但我的情况完全不同:

然而,从概念上讲,我有大量的对象,每个对象都包含两个组件,upper并且lower每个组件都有一个x和一个y坐标。IE

这些数组中的每一个都有大约800长度,但它在对象之间(不在对象内)有所不同,例如

请注意,以上只是我表示数组的方式,我的数据没有存储在C结构或类似的东西中:数据可以按我需要的任何方式组织。关键是,对于每个数组,需要计算平均值、标准偏差和最终的直方图,并且在一个特定对象内,需要计算数组之间的比率和差异。

我应该如何将这些数据发送到 GPU 设备并组织我的线程块层次结构?我的一个想法是对我的所有数组进行零填充,以使它们具有相同的长度,并在每个对象上使用一组块,但如果该方法完全可行的话,似乎存在各种问题。

提前致谢

0 投票
3 回答
3382 浏览

optimization - CUDA 中全局优化的成本函数计算

我正在尝试使用参数( )优化一个函数(比如找到最小值)。所有's 都绑定到某个范围(例如to ),如果任何参数离开此范围,则函数会非常快地变为无穷大。但是,可能很大(从到大约)并且计算它的值需要很长时间。nXnXi-200200n2060-70

我不认为关于函数的细节有很大的相关性,但这里有一些:它由较小的函数(所有不同的)的加权和组成,20-30这些函数本身由倒数符号下的点积总和组成正弦函数(arcsinarccosarctan等)。类似的东西arcsin(X1 . X2) + arcsin(X4 . X7) + ...

该函数通常具有许多局部最小值,因此(朴素)共轭梯度或准牛顿等方法是无用的。搜索整个域蛮力太慢了。

我最初的想法是结合遗传算法使用某种大规模并行化,该算法在函数域中的不同位置执行许多搜索,并定期检查某些搜索是否达到局部最小值。如果是,它比较它们并丢弃除最小的结果之外的所有结果,并继续搜索直到找到一个相当小的值。

我的两个问题是:

1)是否可以在 CUDA 或类似技术中实现这个问题?CUDA 能足够快地计算出这样一个函数的值吗?

2)在多核PC(12+核)上解决问题会更好/更快吗?

0 投票
4 回答
2797 浏览

sorting - 在 CUDA 中按键对(小)数组进行排序

我正在尝试编写一个函数,该函数采用一块未排序的键/值对,例如

并通过键对它们进行排序,同时减少具有相同键的对的值:

目前,我正在使用一个__device__类似下面的函数,它本质上是一种双调排序,它将组合相同键的值并将旧数据设置为无限大的值(仅99现在使用),以便后续的双调排序将筛选将它们移到底部并按int *删除的值将数组切割。

这适用于小数据集,但对于较大的数据集(尽管仍在单个块的大小内),单个调用将无法做到这一点。

尝试将排序和归约结合在同一个函数中是否明智?显然,该函数需要多次调用,但是否可以根据其大小准确确定需要调用多少次才能耗尽所有数据?

或者我应该用这样的东西单独进行减少:

我正在尝试提出最有效的解决方案,但我在 CUDA 和并行算法方面的经验有限。

0 投票
1 回答
1328 浏览

cuda - 使用 cuda 和 CUB 的减少示例

我试图让我的头脑围绕 CUB,并且在遵循(相当不完整的)工作示例时遇到了一些麻烦。CUB 看起来是一个很棒的工具,我只是无法理解示例代码。

我已经构建了一个简单的 proto-warp reduce 示例:

它返回全零。

我知道这段代码将返回一个缩减,该缩减与每个第 32 个元素是一个扭曲的总和而其他元素未定义 - 我只是想了解 CUB 的工作原理。有人可以指出我做错了什么吗?

(另外,CUB 是否值得拥有自己的标签?)

0 投票
2 回答
1988 浏览

cuda - 减少 CUDA

我刚开始学习 CUDA 编程,我对减少有些困惑。

我知道全局内存与共享内存相比有很多访问延迟,但是我可以使用全局内存(至少)模拟类似于共享内存的行为吗?

例如,我想对一个长度正好为BLOCK_SIZE * THREAD_SIZE(网格和块的维度都是 的幂2)的大数组的元素求和,我尝试使用下面的代码:

我对比了这段代码的结果和在主机上串行生成的结果,奇怪的是:有时结果是一样的,但有时却明显不同。在这里使用全局内存有什么原因吗?

0 投票
1 回答
398 浏览

cuda - 多k-selection的cuda和cub实现

我正在尝试并行实现多个 top-k 选择,其中每个选择从 n 个元素的列表中选择 k 个元素,并且有 m 个这样的任务要并行执行。我用 cub 来做到这一点。我遇到了一个奇怪的错误,我不知道我在哪里做错了。我觉得我可能在理解上犯了一些明显的错误,有人可以帮我检查一下吗?

编辑:

我通过cudaDeviceSynchronize()在包含free(). 所以现在我的问题是,does 的free行为不同于cudaFree,因为异步调用立即进行是不允许的,这与我在这里问的另一个问题相反:异步调用后 cudaFree 是否有效?

0 投票
1 回答
921 浏览

cuda - 完全在芯片上制作 CUB blockradixsort?

我正在阅读 CUB 文档和示例:

在示例中,每个线程有 4 个键。看起来“thread_keys”将被分配到全局本地内存中。如果我每个线程只有 1 个密钥,我可以声明“int thread_key;”吗?并仅在寄存器中创建此变量?

BlockRadixSort(temp_storage).Sort() 将指向键的指针作为参数。这是否意味着密钥必须在全局内存中?

我想使用这段代码,但我希望每个线程在寄存器中保存一个键,并在排序后将其保存在寄存器/共享内存中。提前致谢!

0 投票
1 回答
1548 浏览

sorting - cub BlockRadixSort:如何处理大的图块大小或对多个图块进行排序?

使用 cub::BlockRadixSort 在块内进行排序时,如果元素数量过多,我们该如何处理呢?如果我们将 tile 大小设置得太大,临时存储的共享内存将很快无法容纳它。如果我们将其拆分为多个图块,在对每个图块进行排序后如何对其进行后处理?

0 投票
3 回答
2609 浏览

sorting - 在 CUDA 中对许多小数组进行排序

我正在 CUDA 中实现中值滤波器。对于一个特定的像素,我提取了与像素周围的一个窗口相对应的邻居,比如一个N x N( 3 x 3) 窗口,现在有一个N x N元素数组。我不打算为我的应用程序使用超过10 x 10元素的窗口。

该数组现在本地存在于内核中,并已加载到设备内存中。从我读过的以前的 SO 帖子中,最常见的排序算法是由 Thrust 实现的。但是,只能从主机调用 Thrust。线程 -用户编写的内核内部的推力

N x N有没有一种快速有效的方法来对内核中的一小部分元素进行排序?

0 投票
2 回答
684 浏览

c++ - CUB 选择是否返回索引

我最近在使用该Thrust库时遇到了性能问题。这些来自于在大型嵌套循环结构的基础上分配内存的推力。这显然是不希望的,理想的执行是使用预先分配的全局内存板。我想通过以下三种方式之一删除或改进有问题的代码:

  1. 实现自定义推力内存分配器
  2. 用 CUB 代码替换推力代码(带有预先分配的临时存储)
  3. 编写一个自定义内核来做我想做的事

虽然第三个选项是我通常的首选,但我想要执行的操作是copy_if/select_if类型操作,其中返回数据和索引。编写自定义内核可能会重新发明轮子,因此我更愿意选择其他两个选项之一。

我一直听到关于 CUB 的好消息,所以我认为这是在愤怒中使用它的理想机会。我想知道的是:

如何实现select_if带有返回索引的 CUB?

这可以用一个ArgIndexInputIterator和这样的仿函数来完成吗?

在代码的主体中包含以下内容:

这会尝试在后台进行任何内存分配吗?

编辑:

因此,根据 Robert Crovella 的评论,仿函数应该采用取消引用 a 的产品cub::ArgIndexInputIterator<int>,这应该是cub::ItemOffsetPair<int>现在的仿函数:

在代码中,d_out应该是一个设备数组cub::ItemOffsetPair<int,int>