我是一名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) 我有一个相当简单的问题,但我无法找到一个优雅的解决方案.
我有一个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向量并实现任意转换,它接受一个元组并返回其最低值的索引,但是:
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) 我正在尝试编译并运行一个简单的 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) 我在 GNU/Linux 桌面上使用 C++ 编程语言和 GCC。我正在尝试用 C++ 实现一些 PRAM 并行算法。据我了解,在多核 CPU 上使用 OpenMP 或多或少有助于模拟 CREW PRAM 算法。
许多复杂的 PRAM 算法涉及诸如并行前缀求和、排序、对全局地址空间中的向量执行元素操作等操作。
不知何故,经过大约 15 分钟的谷歌搜索后,似乎没有提供此功能的库,即一些开箱即用的基本并行算法或数据结构,如标准模板库。
任何人都可以列出任何这样的库吗?
编辑:本质上,我需要的是与 CUDA 世界中使用的 Thrust 库类似的 OpenMP。http://thrust.github.com/
我可以使用哪些并行算法从给定集合生成随机排列?特别是适合CUDA的论文提案或链接会有所帮助.
这种顺序版本将是Fisher-Yates shuffle.
例:
设S = {1,2,...,7}是源索引的集合.目标是并行生成n个随机排列.n个排列中的每一个恰好包含每个源索引一次,例如{7,6,...,1}.
推力::device_vector 值
推力::device_vector 键;
初始化后,keys包含一些等于-1的元素。我想删除键中和值相同位置的元素。
但不知道并行如何处理?
这是我在 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会启动其他内核来并行排序吗?
我想计算
对于矢量
和
,哪里
表示矢量的大小
.由于这涉及取两个向量的每个相应分量之间的差的平方和的平方根,因此它应该是高度可并行化的任务.我在Windows 10上使用Cuda和Thrust,通过Cygwin .Cuda和Thrust都在工作.
下面的代码编译并运行(使用nvcc),但仅仅因为我已经在底部注释了三行main,我认为每行都应该工作但不会.func::operator()(tup t)认为我传递的论据实际上不是tup类型.
为了使其更有可能至少编译,我还注释了运算符的实际主体.运算符应该找到输入tup的元素之间的平方差异.unary_op从transform_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) 有没有办法将 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) thrust ×10
cuda ×9
c++ ×7
algorithm ×1
c ×1
cmake ×1
memory-leaks ×1
openmp ×1
polymorphism ×1
valgrind ×1