问题标签 [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.
algorithm - CUDA 中的块减少
我正在尝试减少 CUDA,我真的是一个新手。我目前正在研究来自 NVIDIA 的示例代码。
我想我真的不确定如何设置块大小和网格大小,特别是当我的输入数组大于(512 X 512
)大于单个块大小时。
这是代码。
但是,在我看来,g_odata[blockIdx.x]
保存了所有块的部分总和,并且,如果我想获得最终结果,我需要对g_odata[blockIdx.x]
数组中的所有项求和。
我想知道:是否有一个内核来进行整个求和?还是我在这里误解了一些事情?如果有人能用这个来教育我,我将不胜感激。非常感谢。
cuda - 使用 CUB::DeviceScan
我正在尝试在 CUDA 中进行独家减和。我正在使用 CUB 库并决定尝试 CUB::DeviceReduce。但是,我的结果是 NaN,我不知道为什么。
代码是:
此代码为设备结果的最后 8 个元素提供 NaN。
此代码在 Linux Mint15 中的 GTX650 Ti Boost 上运行。我正在使用 NSight,控制台输出编译命令是:
Cuda 版本是 5.5 CUB 版本是 1.0.2
这在另一台装有 Cuda 6、OSX10.9.2、CUB 1.2.3 并运行 GT750M 的计算机上进行了测试,并重现了最后 8 个数字为 NaN 的错误
编辑:代码与 int 和 double 一起正常工作,但不是 float。
编辑:感谢 Robert Crovella,这个问题最初是关于 DeviceReduce 的。该代码有效,它抛出了 NaN,因为早期使用 DeviceScan 的代码将 NaN 作为输入提供给它。修改问题以适应
cuda - CUDA cub::DeviceScan 和 temp_storage_bytes 参数
我正在使用cub::DeviceScan
functiona 并且示例代码片段有一个参数temp_storage_bytes
,它用于分配内存(顺便说一下,代码片段永远不会释放)。
代码片段cub::DeviceScan
使用指向NULL
内存的指针调用函数,该指针触发它计算函数所需的临时设备内存量,然后返回。必要的临时内存是用 分配的cudaMalloc
,并且函数调用会重复指向该内存。然后释放临时内存cudaFree
(或可能应该)。
我正在对不同的浮点数组进行多次设备扫描,但每个浮点数组的长度相同。
我的问题是,我可以假设它temp_storage_bytes
总是相同的值吗?如果是这样,我可以为许多函数调用做一个cudaMalloc
和一个。cudaFree
该示例不清楚如何确定所需的内存以及它是否可以针对给定长度的给定数组进行更改。
c++ - 使用 CUDA 进行残差计算
我有两个向量(oldvector
和newvector
)。我需要计算由以下伪代码定义的残差值:
目前,我正在使用两个 CUDA Thrust 操作来计算这个,这两个操作本质上是在做的:
后跟thrust::transform_reduce
一个正方形作为一元运算符,它正在做:
这个问题显然是之前全局内存的中间存储transform_reduce
。有没有更有效的方法来解决这个问题,可以融合这两个步骤?除了编写自己的 CUDA 内核,还有其他选择吗?
我想到的一种方法是thrust::reduce
用 zip 迭代器编写一个。这样做的问题是运算符的返回类型必须与其输入的类型相同。在我看来,这意味着归约运算符将返回一个元组,这意味着额外的加法。
如果我确实编写了缩减 CUDA 内核,那么缩减内核的 CUDA 1.1 示例是否有任何改进?
visual-studio-2012 - 从内核调用时让 CUB DeviceScan 工作
我目前正在尝试学习如何使用 CUB 来重写我的积分器代码。我一直在查看文档中的示例和代码片段,但我还没有找到我正在尝试做的示例。具体来说,就是运行从主线程调用的 InclusiveSum。从我所见,所有示例都从主机而不是设备调用函数,但提示可以在这里完成:http: //nvlabs.github.io/cub/structcub_1_1_device_scan.html#a7bcc25e4d9c14a23f71431cf1a6b2bd5
“从内核代码调用此方法时,请务必在编译器的宏定义中定义 CUB_CDP 宏。”
我已经尝试在 Visual Studio 2012 中添加它,方法是转到我的项目的属性->Cuda 链接器-> 命令行并添加“-DCUB_CDP”。我不确定这是否正确,但我得到以下构建行:
"nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2012 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0 \VC\bin\x86_amd64" -rdc=true -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6 .0\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -DCUB_CDP -g -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MT " -o "x64\Debug\Algorithm Test.cu.obj" "C:\Users...\Algorithm Test.cu"
我的测试代码涉及一个使用 1 个线程运行的测试内核来模拟我的实际代码的工作方式。
我收到以下错误,来自以下帖子,表明定义此宏 CUB_CDP 是我的错误:
https://groups.google.com/forum/#!searchin/cub-users/CUB_CDP/cub-users/9ltP52Ohosg/uM9_RUy11e0J
我会很感激任何帮助,因为我认为学习如何使用这个库真的可以帮助我开始专注于物理,而不是……除了物理之外的任何东西。
cuda - 在 CUB 类之后使用 cudaDeviceSynchronize
从 CUDA 内核调用 CUB 类后是否需要调用 cudaDeviceSynchronize?当使用设备中的 DeviceReduce::Sum() 时,存在隐式内存副本会阻止设备继续运行,但在使用 GPU 上调用的以下代码后遇到了一些不稳定性:
}
cuda - 如何在一个 CUDA 代码中使用 CUB 和 Thrust
我正在尝试将一些 CUB 引入我的“旧”推力代码中,因此从一个小例子开始与 进行比较thrust::reduce_by_key
,cub::DeviceReduce::ReduceByKey
两者都适用于thrust::device_vectors
.
代码的推力部分很好,但是幼稚地使用通过推力::raw_pointer_cast 获得的原始指针的 CUB 部分在 CUB 调用后崩溃。我cudaDeviceSynchronize()
尝试解决这个问题,但没有帮助。代码的 CUB 部分抄自 CUB 网页。
在 OSX 上,运行时错误是:
在 Linux 上,运行时错误是:
cuda-memcheck 的前几行是:
不幸的是,我不太确定该怎么做。
任何帮助将不胜感激。我在 NVIDIA 开发者专区试过这个,但没有得到任何回应。完整的示例代码如下。它应该与 CUDA 6.5 和 cub 1.3.2 一起编译:
cuda - 为什么我的包容性扫描代码在 CPU 上比在 GPU 上快 2 倍?
我编写了一个简短的 CUDA 程序,该程序使用高度优化的 CUB 库来演示来自旧的四核 Intel Q6600 处理器的一个内核(所有四个都应该能够达到约 30 GFLOPS/秒)可以进行包容性扫描(或累积/prefix sum 如果你愿意的话)在 100,000 个元素上比 Nvidia 750 Ti 快(据说能够达到 1306 GFLOPS/秒的单精度)。为什么会这样?
源代码是:
当我在我的机器上运行它时的输出是:
平均 GPU 模拟时间:0.0011999999405816197 [sim/sec]
平均 CPU 模拟时间:0.00059999997029080987 [sim/sec]
GPU/CPU 时序:2x
另外,这是我的编译标志和输出:
sorting - CUDA 推力排序或 CUB::DeviceRadixSort
我有一个由 float4 数组表示的粒子池,其中 w 分量是粒子在 [0, 1] 范围内的当前生命周期。
我需要根据粒子的生命周期按降序对这个数组进行排序,以便我可以准确地计算当前“活跃”粒子的数量(生命周期大于 0)。我需要这个计数器,因为当我需要激活更多粒子(随机发生)时,它可以让我索引到数组中的正确位置。
我的粒子数组存储在设备内存中,看起来我应该能够对数组进行排序,而无需将数组传输到主机内存。
我在网上找到一些例子来展示我如何使用 Thrust 或 CUB 做到这一点的运气并不好。另外,我对使用 Thrust 犹豫不决,因为我不知道如何防止它退化为合并排序(这比基数排序慢得多),因为我需要基于 w 组件进行排序。至于 CUB,我根本没有找到任何关于如何做到这一点的资源。
我还希望将生命周期保存在 w 组件中,因为这使我在代码的其他部分中的生活变得更加轻松。
有没有一种简单的方法可以做到这一点?谢谢你的帮助。
cuda - Sum reduction with CUB
According to this article, sum reduction with CUB Library should be one of the fastest way to make parallel reduction. As you can see in a code fragment below, the execution time is measure excluding first cub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, in, out, N, cub::Sum());
I assume that it's something connected with memory preparation and when we reduce several times the same data it isn't neccesary to call it every time but when I've got many different arrays with the same number of elements and type of data do I have to do it every time? If the answer is yes, it means that usage of CUB Library becomes pointless.