标签: thrust

在我的机器上操作大型矢量时,CUDA推力变慢

我是一名CUDA初学者并正在阅读一些推力教程.我写了一个简单但非常有组织的代码并试图找出推力的加速度.(这个想法是否正确?).我尝试通过在cpu上添加数组并在gpu上添加device_vector,将两个向量(10000000 int)添加到另一个向量.

这是事情:

#include <iostream>
#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>

#define N 10000000
int main(void)
{
    float time_cpu;
    float time_gpu;
    int *a = new int[N];
    int *b = new int[N];
    int *c = new int[N];
    for(int i=0;i<N;i++)
    {
        a[i]=i;
        b[i]=i*i;
    }
    clock_t start_cpu,stop_cpu;
    start_cpu=clock();
    for(int i=0;i<N;i++)
    {
        c[i]=a[i]+b[i];
    }
    stop_cpu=clock();   
    time_cpu=(double)(stop_cpu-start_cpu)/CLOCKS_PER_SEC*1000;
    std::cout<<"Time to generate (CPU):"<<time_cpu<<std::endl;
    thrust::device_vector<int> X(N);
    thrust::device_vector<int> Y(N);
    thrust::device_vector<int> Z(N);
    for(int i=0;i<N;i++)
    {
        X[i]=i;
        Y[i]=i*i;
    }
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);
    cudaEventRecord(start,0);       
    thrust::transform(X.begin(), X.end(), …
Run Code Online (Sandbox Code Playgroud)

c c++ cuda thrust

6
推荐指数
1
解决办法
4548
查看次数

使用CUDA Thrust确定每个矩阵列中的最小元素及其位置

我有一个相当简单的问题,但我无法找到一个优雅的解决方案.

我有一个Thrust代码,它生成c包含值的相同大小的向量.假设这些c向量中的每一个都有一个索引.我想为每个向量位置获取c值为最低的向量的索引:

例:

C0 =     (0,10,20,3,40)
C1 =     (1,2 ,3 ,5,10)
Run Code Online (Sandbox Code Playgroud)

我会得到一个包含C具有最低值的向量索引的向量:

result = (0,1 ,1 ,0,1)
Run Code Online (Sandbox Code Playgroud)

我已经考虑过使用推力zip迭代器来做这件事,但是已经遇到了问题:我可以压缩所有c向量并实现任意转换,它接受一个元组并返回其最低值的索引,但是:

  1. 如何迭代元组的内容?
  2. 据我所知,元组只能存储10元素,并且可以存在比10 c矢量更多的元素.

然后我考虑这样做:不是使用c单独的向量,而是将它们全部附加到单个向量中C,然后生成引用位置的键并按键执行稳定排序,这将从同一位置重新组合向量条目.在示例中,将给出:

C =      (0,10,20,3,40,1,2,3,5,10)
keys =   (0,1 ,2 ,3,4 ,0,1,2,3,4 )
after stable sort by key:
output = (0,1,10,2,20,3,3,5,40,10)
keys =   (0,0,1 ,1,2 ,2,3,3,4 ,4 )
Run Code Online (Sandbox Code Playgroud)

然后使用向量中的位置生成键,使用向量的索引压缩输出,c然后使用自定义函数执行按键缩减,对于每个缩减,输出具有最低值的索引.在示例中:

input =  (0,1,10,2,20,3,3,5,40,10)
indexes= (0,1,0 ,1,0 ,1,0,1,0 ,1)
keys =   (0,0,1 ,1,2 …
Run Code Online (Sandbox Code Playgroud)

c++ cuda thrust

6
推荐指数
1
解决办法
2373
查看次数

在 cpp 文件中使用时推力静态断言

我正在尝试编译并运行一个简单的 Cuda/thrust 程序,当扩展名是 时它可以工作,.cu但当源扩展名是.cpp. 我已经在 cmake 中应用了 cpp 文件所需的更改,但我得到了

错误:静态断言失败:此系统未实现 THRUST_STATIC_ASSERT_MSG

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(thrust_test LANGUAGES CXX CUDA)

find_package(CUDA 10.0 REQUIRED)
message(STATUS "CUDA ${CUDA_VERSION_STRING} at ${CUDA_TOOLKIT_ROOT_DIR}")
set(CUDA_LINK_LIBRARIES_KEYWORD PUBLIC)

include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})

set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CUDA_SEPARABLE_COMPILATION ON)

set_source_files_properties(
        main.cpp
        PROPERTIES
        CUDA_SOURCE_PROPERTY_FORMAT
        OBJ)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

和main.cpp:

__host__
__device__
int foo() {

    // generate random data serially
    thrust::host_vector<int> h_vec(100);
    std::generate(h_vec.begin(), h_vec.end(), rand);

    // transfer to device and compute sum
    thrust::device_vector<int> d_vec = h_vec;
    return thrust::reduce(d_vec.begin(), d_vec.end(), 0, …
Run Code Online (Sandbox Code Playgroud)

c++ cuda cmake thrust

6
推荐指数
1
解决办法
4050
查看次数

用于将 OpenMP 与 C++ 结合使用的算法库

我在 GNU/Linux 桌面上使用 C++ 编程语言和 GCC。我正在尝试用 C++ 实现一些 PRAM 并行算法。据我了解,在多核 CPU 上使用 OpenMP 或多或少有助于模拟 CREW PRAM 算法。

许多复杂的 PRAM 算法涉及诸如并行前缀求和、排序、对全局地址空间中的向量执行元素操作等操作。

不知何故,经过大约 15 分钟的谷歌搜索后,似乎没有提供此功能的库,即一些开箱即用的基本并行算法或数据结构,如标准模板库。

任何人都可以列出任何这样的库吗?

编辑:本质上,我需要的是与 CUDA 世界中使用的 Thrust 库类似的 OpenMP。http://thrust.github.com/

c++ parallel-processing multithreading openmp thrust

5
推荐指数
1
解决办法
881
查看次数

如何使用CUDA生成随机排列

我可以使用哪些并行算法从给定集合生成随机排列?特别是适合CUDA的论文提案或链接会有所帮助.

这种顺序版本将是Fisher-Yates shuffle.

例:

设S = {1,2,...,7}是源索引的集合.目标是并行生成n个随机排列.n个排列中的每一个恰好包含每个源索引一次,例如{7,6,...,1}.

c++ algorithm cuda thrust

5
推荐指数
1
解决办法
3222
查看次数

从 device_vector 中删除元素

推力::device_vector 值

推力::device_vector 键;

初始化后,keys包含一些等于-1的元素。我想删除键中和值相同位置的元素。

但不知道并行如何处理?

cuda thrust

5
推荐指数
1
解决办法
2052
查看次数

CUDA / CUDA Thrust 中的多态性和派生类

这是我在 Stack Overflow 上的第一个问题,这是一个很长的问题。thrust::device_vector<BaseClass>tl;dr 版本是:如果我希望 a 存储不同类型的对象,我该如何使用 aDerivedClass1DerivedClass2a ?

\n\n

我想利用 CUDA Thrust 的多态性。我正在编译一个-arch=sm_30GPU (GeForce GTX 670) 进行编译。

\n\n

让我们看一下下面的问题:假设镇上有 80 户家庭。其中60户是已婚夫妇,20户是单亲家庭。因此,每个家庭都有不同数量的成员。现在是人口普查时间,家庭必须说明父母的年龄和孩子的数量。Family因此,政府构建了一个对象数组,thrust::device_vector<Family> familiesInTown(80)即家庭信息familiesInTown[0]对应familiesInTown[59]为已婚夫妇,其余信息(familiesInTown[60]为 )familiesInTown[79] ) 为单亲家庭。

\n\n
    \n
  • Family是基类 - 家庭中父母的数量(单亲父母数量为 1,夫妻数量为 2)以及他们拥有的孩子数量作为成员存储在此处。
  • \n
  • SingleParent,派生自Family,包括一个新成员 - 单亲父母的年龄,unsigned int ageOfParent
  • \n
  • MarriedCouple,也源自Family,但是,引入了两个新成员 - 父母的年龄,unsigned int ageOfParent1以及unsigned int ageOfParent2

    \n\n …

polymorphism cuda thrust

5
推荐指数
2
解决办法
3831
查看次数

在线程中使用thrust :: sort

我想知道在一个线程中是否可以使用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会启动其他内核来并行排序吗?

cuda thrust

5
推荐指数
1
解决办法
3094
查看次数

CUDA推拉zip_iterator元组transform_reduce

我想计算 \ left | \vec {a}  - \vec {b}\right | 对于矢量 \ VEC {A}\ VEC {B},哪里 \ left | \vec {x}\right | 表示矢量的大小 \ VEC {X}.由于这涉及取两个向量的每个相应分量之间的差的平方和的平方根,因此它应该是高度可并行化的任务.我在Windows 10上使用Cuda和Thrust,通过Cygwin .Cuda和Thrust都在工作.

下面的代码编译并运行(使用nvcc),但仅仅因为我已经在底部注释了三行main,我认为每行都应该工作但不会.func::operator()(tup t)认为我传递的论据实际上不是tup类型.

为了使其更有可能至少编译,我还注释了运算符的实际主体.运算符应该找到输入tup的元素之间的平方差异.unary_optransform_reduce(在这种情况下func())的减少将添加这些,给出我的矢量差异的范数平方.

#include <iostream>
#include <stdlib.h>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/tuple.h>
#include <thrust/transform_reduce.h>
#include <thrust/iterator/zip_iterator.h>

typedef thrust::device_vector<float> dvec;
typedef dvec::iterator iter;
typedef thrust::tuple<iter, iter> tup;

struct func: public thrust::unary_function<tup, float>
{
  __device__ float operator()(tup t) //difsq
  {
    // I've commented out these two lines for testing purposes:
    // float f = thrust::get<0>(t) - thrust::get<1>(t);
    // return f*f;
    return 3.14;
  } …
Run Code Online (Sandbox Code Playgroud)

c++ cuda thrust

5
推荐指数
1
解决办法
1467
查看次数

如何结合使用thrust和valgrind来检测内存泄漏?

有没有办法将 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)

c++ valgrind memory-leaks cuda thrust

5
推荐指数
1
解决办法
620
查看次数