问题标签 [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.
arrays - CUDA 减少了许多大小不等的小型阵列
我想知道是否有人可以建议计算CUDA中大量相对较小但大小不同的数组的均值/标准偏差的最佳方法?
SDK中的并行缩减示例适用于单个非常大的数组,看起来大小方便地是每个块的线程数的倍数,但我的情况完全不同:
然而,从概念上讲,我有大量的对象,每个对象都包含两个组件,upper
并且lower
每个组件都有一个x
和一个y
坐标。IE
这些数组中的每一个都有大约800
长度,但它在对象之间(不在对象内)有所不同,例如
请注意,以上只是我表示数组的方式,我的数据没有存储在C
结构或类似的东西中:数据可以按我需要的任何方式组织。关键是,对于每个数组,需要计算平均值、标准偏差和最终的直方图,并且在一个特定对象内,需要计算数组之间的比率和差异。
我应该如何将这些数据发送到 GPU 设备并组织我的线程块层次结构?我的一个想法是对我的所有数组进行零填充,以使它们具有相同的长度,并在每个对象上使用一组块,但如果该方法完全可行的话,似乎存在各种问题。
提前致谢
optimization - CUDA 中全局优化的成本函数计算
我正在尝试使用参数( )优化一个函数(比如找到最小值)。所有's 都绑定到某个范围(例如to ),如果任何参数离开此范围,则函数会非常快地变为无穷大。但是,可能很大(从到大约)并且计算它的值需要很长时间。n
Xn
Xi
-200
200
n
20
60-70
我不认为关于函数的细节有很大的相关性,但这里有一些:它由较小的函数(所有不同的)的加权和组成,20-30
这些函数本身由倒数符号下的点积总和组成正弦函数(arcsin
、arccos
、arctan
等)。类似的东西arcsin(X1 . X2) + arcsin(X4 . X7) + ...
。
该函数通常具有许多局部最小值,因此(朴素)共轭梯度或准牛顿等方法是无用的。搜索整个域蛮力太慢了。
我最初的想法是结合遗传算法使用某种大规模并行化,该算法在函数域中的不同位置执行许多搜索,并定期检查某些搜索是否达到局部最小值。如果是,它比较它们并丢弃除最小的结果之外的所有结果,并继续搜索直到找到一个相当小的值。
我的两个问题是:
1)是否可以在 CUDA 或类似技术中实现这个问题?CUDA 能足够快地计算出这样一个函数的值吗?
2)在多核PC(12+核)上解决问题会更好/更快吗?
sorting - 在 CUDA 中按键对(小)数组进行排序
我正在尝试编写一个函数,该函数采用一块未排序的键/值对,例如
并通过键对它们进行排序,同时减少具有相同键的对的值:
目前,我正在使用一个__device__
类似下面的函数,它本质上是一种双调排序,它将组合相同键的值并将旧数据设置为无限大的值(仅99
现在使用),以便后续的双调排序将筛选将它们移到底部并按int *
删除的值将数组切割。
这适用于小数据集,但对于较大的数据集(尽管仍在单个块的大小内),单个调用将无法做到这一点。
尝试将排序和归约结合在同一个函数中是否明智?显然,该函数需要多次调用,但是否可以根据其大小准确确定需要调用多少次才能耗尽所有数据?
或者我应该用这样的东西单独进行减少:
我正在尝试提出最有效的解决方案,但我在 CUDA 和并行算法方面的经验有限。
cuda - 使用 cuda 和 CUB 的减少示例
我试图让我的头脑围绕 CUB,并且在遵循(相当不完整的)工作示例时遇到了一些麻烦。CUB 看起来是一个很棒的工具,我只是无法理解示例代码。
我已经构建了一个简单的 proto-warp reduce 示例:
它返回全零。
我知道这段代码将返回一个缩减,该缩减与每个第 32 个元素是一个扭曲的总和而其他元素未定义 - 我只是想了解 CUB 的工作原理。有人可以指出我做错了什么吗?
(另外,CUB 是否值得拥有自己的标签?)
cuda - 减少 CUDA
我刚开始学习 CUDA 编程,我对减少有些困惑。
我知道全局内存与共享内存相比有很多访问延迟,但是我可以使用全局内存(至少)模拟类似于共享内存的行为吗?
例如,我想对一个长度正好为BLOCK_SIZE * THREAD_SIZE
(网格和块的维度都是 的幂2
)的大数组的元素求和,我尝试使用下面的代码:
我对比了这段代码的结果和在主机上串行生成的结果,奇怪的是:有时结果是一样的,但有时却明显不同。在这里使用全局内存有什么原因吗?
cuda - 多k-selection的cuda和cub实现
我正在尝试并行实现多个 top-k 选择,其中每个选择从 n 个元素的列表中选择 k 个元素,并且有 m 个这样的任务要并行执行。我用 cub 来做到这一点。我遇到了一个奇怪的错误,我不知道我在哪里做错了。我觉得我可能在理解上犯了一些明显的错误,有人可以帮我检查一下吗?
编辑:
我通过cudaDeviceSynchronize()
在包含free()
. 所以现在我的问题是,does 的free
行为不同于cudaFree
,因为异步调用立即进行是不允许的,这与我在这里问的另一个问题相反:异步调用后 cudaFree 是否有效?
cuda - 完全在芯片上制作 CUB blockradixsort?
我正在阅读 CUB 文档和示例:
在示例中,每个线程有 4 个键。看起来“thread_keys”将被分配到全局本地内存中。如果我每个线程只有 1 个密钥,我可以声明“int thread_key;”吗?并仅在寄存器中创建此变量?
BlockRadixSort(temp_storage).Sort() 将指向键的指针作为参数。这是否意味着密钥必须在全局内存中?
我想使用这段代码,但我希望每个线程在寄存器中保存一个键,并在排序后将其保存在寄存器/共享内存中。提前致谢!
sorting - cub BlockRadixSort:如何处理大的图块大小或对多个图块进行排序?
使用 cub::BlockRadixSort 在块内进行排序时,如果元素数量过多,我们该如何处理呢?如果我们将 tile 大小设置得太大,临时存储的共享内存将很快无法容纳它。如果我们将其拆分为多个图块,在对每个图块进行排序后如何对其进行后处理?
sorting - 在 CUDA 中对许多小数组进行排序
我正在 CUDA 中实现中值滤波器。对于一个特定的像素,我提取了与像素周围的一个窗口相对应的邻居,比如一个N x N
( 3 x 3
) 窗口,现在有一个N x N
元素数组。我不打算为我的应用程序使用超过10 x 10
元素的窗口。
该数组现在本地存在于内核中,并已加载到设备内存中。从我读过的以前的 SO 帖子中,最常见的排序算法是由 Thrust 实现的。但是,只能从主机调用 Thrust。线程 -用户编写的内核内部的推力
N x N
有没有一种快速有效的方法来对内核中的一小部分元素进行排序?
c++ - CUB 选择是否返回索引
我最近在使用该Thrust
库时遇到了性能问题。这些来自于在大型嵌套循环结构的基础上分配内存的推力。这显然是不希望的,理想的执行是使用预先分配的全局内存板。我想通过以下三种方式之一删除或改进有问题的代码:
- 实现自定义推力内存分配器
- 用 CUB 代码替换推力代码(带有预先分配的临时存储)
- 编写一个自定义内核来做我想做的事
虽然第三个选项是我通常的首选,但我想要执行的操作是copy_if
/select_if
类型操作,其中返回数据和索引。编写自定义内核可能会重新发明轮子,因此我更愿意选择其他两个选项之一。
我一直听到关于 CUB 的好消息,所以我认为这是在愤怒中使用它的理想机会。我想知道的是:
如何实现select_if
带有返回索引的 CUB?
这可以用一个ArgIndexInputIterator
和这样的仿函数来完成吗?
在代码的主体中包含以下内容:
这会尝试在后台进行任何内存分配吗?
编辑:
因此,根据 Robert Crovella 的评论,仿函数应该采用取消引用 a 的产品cub::ArgIndexInputIterator<int>
,这应该是cub::ItemOffsetPair<int>
现在的仿函数:
在代码中,d_out
应该是一个设备数组cub::ItemOffsetPair<int,int>
: