- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据矩阵,我应该使用 GPU(以及可能的 thrust 库)对其进行一些详细说明。到目前为止,我已经能够将数据复制到 GPU 并编写自己的内核函数。现在,根据我的内核函数的输出,我将利用 thrust 库对同一数据矩阵进行其他阐述,尽可能避免从 GPU<->CPU 下载和重新上传数据。
因此,我使用 cudaMallocPitch 函数在 GPU 中创建了一个设备变量:
float *d_M;
size_t pitch;
cudaStatus = cudaMallocPitch(&d_M, &pitch, sizeof(float)*(N), M+1);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMalloc Failed!");
INFO;
return CUDA_MALLOC_ERROR;
}
此变量表示维度为 NxM+1 的矩阵。在使用 ad-hoc cuda 函数对 GPU 进行一些详细说明后,我将使用推力库对每一行的元素求和,并将结果放在每一行的 M+1 列。
对于这样的操作,我会使用 thrust 库。我的意图应该是检索使用 cudaMallocPitch 创建的原始指针,将其转换为thrust::device_ptr,然后使用 thrust 函数对其进行操作。所以,在代码中:
thrust::device_ptr<float> dd_M = thrust::device_pointer_cast(d_M);
但是,当我尝试打印两个变量的地址以确保指针具有相同的地址时:
printf("Address d_M: %p\n", &d_M);
printf("Address dd_M: %p\n", &dd_M);
我得到了不同的地址值。我不知道我做错了什么。对于这样的操作,我只是按照链接 Thrust - Memory Management Functions 上的推力手册进行操作。 .
最佳答案
cudaMallocPitch
基本上无法使用推力。这是因为它创建了这样的分配:
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
...
D
项代表您的实际数据,X
项代表附加到每一行的额外空间,以使您的数据宽度与所需的机器间距相匹配。
问题是 thrust 没有这个由 X
表示的“未使用”区域的概念。当数据中有“未使用”的间隙时,没有方便的方法告诉推力函数分配线程(并生成适当的、连续的索引)。因此,如果我们将上述内容转换为推力 vector :
D D D D D D D D D D D D D D X X D D D D D D D D D D D D D D X X D D ...
分散在 vector 中的 X
区域在推力算法和索引中不能方便地“跳过”。如果你真的想这样做,可能会想出一个 thrust::permutation_iterator
来解决上面的映射,但这将有其自身的低效率,这将超过任何对倾斜数据进行操作带来的性能优势。
如果您改用 cudaMalloc
,那么您的数据将是连续的,正如 thrust 所期望的那样。
关于c++ - 推力 : Accessing a device variable created with cudaMallocPitch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783396/
我需要一些帮助来追踪 thrust::fill 给我的编译错误。 代码没有问题: line 9 #include // needed for other thrus
如何使用推力返回事件数组元素的索引,即返回数组元素等于 1 的索引向量? 对此进行扩展,在给定数组维度的多维索引的情况下,这将如何工作? 编辑:目前该功能看起来像这样 template void Vo
当尝试创建thrust::device_vector的struct时,我得到了Bus error (core dumped)。奇怪的是,下面的代码在我的笔记本电脑(Quadro P2000)上运行良好
我尝试将数据从主机复制到设备并返回,但不是使用 CUDA API,而是使用推力库。我在 thrust::host_vector 中分配了内存,并尝试将其复制到 thrust::device_vecto
我有一对大小相等的数组,我将它们称为键和值。 例如: K: V 1: 99 1: 100 1: 100 1: 100 1: 103 2: 103 2: 105 3: 45 3: 67 键被排序,与每个
我想知道是否可以使用 Thrust 库按键排序,而无需创建 Vector 来存储键(动态)。例如,我有以下两个 vector :键和值: vectorKeys: 0, 1, 2, 0,
假设我想做一个 thrust::reduce_by_key 但我不关心输出键是什么。有没有一种方法可以通过某种方式将空对象(可能是空指针)传递给该参数的算法,从而不会创建毫无意义的输出键列表,从而节省
我目前正在通过以下方式按键对值进行排序 thrust::sort_by_key(thrust::device_ptr(keys), thrust::device
这个问题在这里已经有了答案: is there a better and a faster way to copy from CPU memory to GPU using thrust? (1 个回
有没有办法在不实际分配 vector 的情况下声明推力 vector 指针?我需要将此指针用作类中的成员变量。因为我事先并不知道 vector 的大小,所以我不能将 vector 静态分配为成员变量。
我想知道如何 thrust::set_intersection有效,但从我的测试结果来看,我对这个函数的作用更加困惑。 举几个例子: const int size1 = 5; const int si
考虑以下数据集和质心。一共有7个人,两个均值有8个维度。它们按行主要顺序存储。 short dim = 8; float centroids[] = { 0.223, 0.002, 0.223
我有以下(可编译和可执行)代码,使用 CUDA Thrust 来执行 float2 数组的缩减。它工作正常 using namespace std; // includes, system #incl
我有一个使用 Thrust 目前在单个 GPU 上正常工作的 Cuda C++ 代码。我现在想为多 GPU 修改它。我有一个主机函数,其中包括许多对设备数组进行排序、复制、计算差异等的推力调用。我想使
我在 thrust::device_vector 中有一个矩阵(面向行) .有什么方法可以获取该 vector 的切片/ View (也属于 thrust::device_vector 类型)?我对复
我遇到了 thrust 库的 reduce_by_key 函数的问题。对我来说这看起来像是一个错误,但我想在报告之前确定一下。 首先,我的设置:CUDA 7.0、Windows 8、NIVIDA Ge
我有以下函数,用于用从 -time/2 到 time/2 的步长和步长 dt 填充 vector t: #define THRUST_PREC thrust::complex __host__ voi
在我现在正在编写的程序中,我想使用 GPU 或 CPU 进行计算(用于对彼此进行基准测试)。为此,我想要一些通用指针,我可以像这样使用 device_vector 或 host_vector 的实例对
我试图找到数组中的最小元素: thrust::device_ptr devPtr(d_ary); int minPos = thrust::min_element(devPtr.begin(),
我的计划是使用 Pearsons 相关性计算距离矩阵,并从距离矩阵中为每个节点 (q=ln(n)) 获取 q-最近邻,并将它们放入结果向量中。我在 C++ 中使用相关函数循环内的 STL 优先级队列来
我是一名优秀的程序员,十分优秀!