数组CUDA中下列元素的和
Sum of following elements in array CUDA
首先我要注意到我读过这不是我想要的结果。
假设我有一个包含元素的数组:
array[0] = 2
array[1] = 1
array[2] = -1
array[3] = 3
array[4] = -1
array[5] = 2
结果应该是:
array[0] = array[0] = 2
array[1] = array[0] + array[1] = 2 + 1 = 3
array[2] = -1 (when -1 omitting)
array[3] = array[0] + array[1] + array[3] = 2 + 1 + 3 = 6 (ommited array[2] due to -1 value)
array[4] = -1 (omitting)
array[5] = array[0] + array[1] + array[3] + array[5] = 2 + 1 + 3 + 2 = 8
一般应该是:
array[0] = array[0]
array[1] = array[0] + array[1]
array[2] = array[1] + array[2]
array[3] = array[2] + array[3]
array[4] = array[3] + array[4]
array[5] = array[4] + array[5]
or just
array[n] += array[n-1] where n > 0
(提交-1可以稍后添加)。
我想在CUDA中并行执行。实现这一目标的最快方法是什么?
您可以使用thrust::inclusive_scan
:
#include <thrust/device_vector.h>
#include <thrust/scan.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/iterator/counting_iterator.h>
#include <iostream>
struct omit_negative : public thrust::unary_function<int, int>
{
__host__ __device__
int operator()(int value)
{
if (value<0)
{
value = 0;
}
return value;
}
};
int main()
{
int array[] = {2,1,-1,3,-1,2};
const int array_size = sizeof(array)/sizeof(array[0]);
thrust::device_vector<int> d_array(array, array + array_size);
thrust::device_vector<int> d_result(array_size);
std::cout << "input data" << std::endl;
thrust::copy(d_array.begin(), d_array.end(), std::ostream_iterator<int>(std::cout, " "));
thrust::inclusive_scan(thrust::make_transform_iterator(d_array.begin(), omit_negative()),
thrust::make_transform_iterator(d_array.end(), omit_negative()),
d_result.begin());
std::cout << std::endl << "after inclusive_scan" << std::endl;
thrust::copy(d_result.begin(), d_result.end(), std::ostream_iterator<int>(std::cout, " "));
using namespace thrust::placeholders;
thrust::scatter_if(d_array.begin(),
d_array.end(),
thrust::make_counting_iterator(0),
d_array.begin(),
d_result.begin(),
_1<0
);
std::cout << std::endl << "after scatter_if" << std::endl;
thrust::copy(d_result.begin(), d_result.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
input data
2 1 -1 3 -1 2
after inclusive_scan
2 3 3 6 6 8
after scatter_if
2 3 -1 6 -1 8
相关文章:
- 如何使用opencv GpuMat在cuda上执行逐元素矩阵乘法?
- CUDA C/C 访问先前的数组元素
- CUDA:所有矢量元素的级联求和
- 如何将原子添加到CUDA中的阵列的每个元素上
- 在 CUDA / 推力中,如何在每个操作期间访问矢量元素的邻居?
- 如何在CUDA内核中添加向量元素
- 如何使用 CUDA 正确实现每个元素上的执行函数
- CUDA中的三维元素矩阵乘法
- 循环访问 CUDA 中的三维数组以对它们的元素求和
- CUDA/CUBLAS:访问数组中的元素
- 使用 CUDA 推力确定最小元素及其在每个矩阵列中的位置
- 如何在Cuda编程中为矩阵做元素明智的指数
- 使用CUDA Thrust置换迭代器复制数组的特定元素
- CUDA功能只适用于某些元素
- 是否有可能使用CUDA来有效地计算排序数组内元素的频率?
- 如何从两个数组中生成一对向量,然后使用CUDA/Thrust按对的第一个元素排序
- 数组CUDA中下列元素的和
- Cuda有效地从字节数组复制到不同大小的共享内存元素
- Cuda Thrust获得分段中的前一个元素
- 在 CUDA 中相互减去向量的元素