我正在使用CUDA/Thrust/CUDPP.据我所知,在Stream压缩中,数组中的某些项被标记为无效,然后被"删除".
现在"删除"究竟意味着什么?假设原始数组A并且长度为6.如果2个元素无效(根据我们可能提供的任何条件)那么
系统是否在GPU内存中创建一个大小为4 的新数组来存储有效元素以获得最终结果?
或者它是否从内存中物理删除了无效元素,并将原始数组A缩小到4,只保留有效元素?
对于任何一种情况,这是否意味着动态内存分配正在引擎盖下?但我听说在CUDA世界中不可能进行动态内存分配.
是否可以使用Thrust创建一个device_vectors数组?我知道我无法创建device_vector的device_vector,但是如何创建device_vectors数组呢?
我可以使用哪些并行算法从给定集合生成随机排列?特别是适合CUDA的论文提案或链接会有所帮助.
这种顺序版本将是Fisher-Yates shuffle.
例:
设S = {1,2,...,7}是源索引的集合.目标是并行生成n个随机排列.n个排列中的每一个恰好包含每个源索引一次,例如{7,6,...,1}.
我的应用程序需要数百万条输入记录,每条记录 8 个字节,并将每条记录散列到两个或更多输出箱中。也就是说,每个输入密钥 K 创建少量对 (B1,K)、(B2,K)... 每个密钥的输出 bin 数量在处理该密钥之前是未知的。通常为 2 个,但有时也可能为 10 个或更多。
所有这些输出对最终都需要存储在一个数组中,因为每个 bin 中的所有键稍后将一起处理。如何有效地做到这一点?
使用原子增量从全局数组中重复保留一对听起来非常慢。另一个明显的方法是将哈希表初始化为指向每个容器某种存储的指针数组。这样看起来比较慢。
我正在考虑在块共享数组中为每个输入记录预先保留 2 对,然后根据需要获取更多空间(即重新实现 STL 向量保留操作),然后让每个块中的最后一个线程复制共享块数组到全局内存。
但我并不期待实施这一点。帮助?谢谢。
推力::device_vector 值
推力::device_vector 键;
初始化后,keys包含一些等于-1的元素。我想删除键中和值相同位置的元素。
但不知道并行如何处理?
我正在为CUDA中的项目寻找高性能多扫描/多前缀和(一个内核执行中的许多行)函数.
我尝试过Thrust库中的那个但是它太慢了.使用nvcc调试标志(-g -G)编译后也会导致崩溃.
在我与Thrust失败之后,我专注于cuDPP库,它曾经是CUDA工具包的一部分.cuDPP性能非常好但是库没有最新的cuda 5.5,并且在使用内存检查器进行调试时,cudppMultiScan()函数中存在一些全局内存冲突问题.(cuda 5.5,nsight 3.1,visual studio 2010,gtx 260 cc 1.3)
有没有人知道使用什么而不是这两个库?
R.
这是我在 Stack Overflow 上的第一个问题,这是一个很长的问题。thrust::device_vector<BaseClass>tl;dr 版本是:如果我希望 a 存储不同类型的对象,我该如何使用 aDerivedClass1,DerivedClass2a ?
我想利用 CUDA Thrust 的多态性。我正在编译一个-arch=sm_30GPU (GeForce GTX 670) 进行编译。
让我们看一下下面的问题:假设镇上有 80 户家庭。其中60户是已婚夫妇,20户是单亲家庭。因此,每个家庭都有不同数量的成员。现在是人口普查时间,家庭必须说明父母的年龄和孩子的数量。Family因此,政府构建了一个对象数组,thrust::device_vector<Family> familiesInTown(80)即家庭信息familiesInTown[0]对应familiesInTown[59]为已婚夫妇,其余信息(familiesInTown[60]为 )familiesInTown[79] ) 为单亲家庭。
Family是基类 - 家庭中父母的数量(单亲父母数量为 1,夫妻数量为 2)以及他们拥有的孩子数量作为成员存储在此处。SingleParent,派生自Family,包括一个新成员 - 单亲父母的年龄,unsigned int ageOfParent。MarriedCouple,也源自Family,但是,引入了两个新成员 - 父母的年龄,unsigned int ageOfParent1以及unsigned int ageOfParent2。
我想知道在一个线程中是否可以使用thrust :: sort()
__global__
void mykernel(float* array, int arrayLength)
{
int threadID = blockIdx.x * blockDim.x + threadIdx.x;
// array length is vector in the device global memory
// is it possible to use inside the thread?
thrust::sort(array, array+arrayLength);
// do something else with the array
}
Run Code Online (Sandbox Code Playgroud)
如果是,那么sort会启动其他内核来并行排序吗?
我正在寻找一种方法来使用该thrust::counting_iterator函数来并行化以下for循环:
for (int stride = 0 ; stride < N * M ; stride+=M) // N iterations
{
// Body of the loop
}
Run Code Online (Sandbox Code Playgroud)
以下是代码的外观:
struct functor ()
{
__host__ __device__ void operator() (const int i)
{
// Body of the loop
}
}
thrust::counting_iterator<int> it1(0);
thrust::counting_iterator<int> it2 = it1 + N * M;
thrust::for_each (it1 , it2 , functor());
Run Code Online (Sandbox Code Playgroud)
我知道将counting_iterator迭代器增加1,那么有没有办法增加M?
有没有办法将 CUDA Thrust 库与 Valgrind 内存泄漏检查器一起使用?
我问的原因是因为这个简单的程序:
#include <thrust/device_vector.h>
int main(){
thrust::device_vector<int> D(5);
assert( D.size() == 5 );
}
Run Code Online (Sandbox Code Playgroud)
编译为:
#include <thrust/device_vector.h>
int main(){
thrust::device_vector<int> D(5);
assert( D.size() == 5 );
}
Run Code Online (Sandbox Code Playgroud)
使 Valgrind 相信存在多种可能的内存泄漏。
我知道它们一定是误报,而且 valgrind 不是用来检测 GPU 内存泄漏的,但我想知道是否有一个标志或标准方法可以使这两个工具一起工作(例如检测 CPU 内存泄漏)。
如果有一套标准的 Valgrind 异常,我会很乐意使用它们,但我想在玩 wack-a-mole 之前先问一下。
$ /usr/local/cuda-11.1/bin/nvcc device_vector.cu -o device_vector.cu.x
Run Code Online (Sandbox Code Playgroud)
提到的自述文件README_MISSING_SYSCALL_OR_IOCTL对我来说不是很有帮助。
添加注释:CUDA 附带了一个名为 memchecker 的 memchecker cuda-memcheck,它不会报告上面程序中的内存泄漏,但它似乎不能替代 valgrind,因为它不会检测简单 cpu 程序中的实际内存泄漏:
#include <thrust/device_vector.h>
int main(){
// thrust::device_vector<int> D(5);
// assert( D.size() == 5 );
// …Run Code Online (Sandbox Code Playgroud)