草庐IT

libtorch_cuda_cu

全部标签

c++ - CUDA 动态并行,性能差

我们在使用CUDA动态并行时遇到了性能问题。目前,CDP的执行速度至少比传统方法慢3倍。我们做了最简单的可重现代码来展示这个问题,就是把一个数组的所有元素的值都增加+1。即,a[0,0,0,0,0,0,0,.....,0]-->kernel+1-->a[1,1,1,1,1,1,1,1,1]这个简单示例的目的只是为了查看CDP是否可以像其他的一样执行,或者是否存在严重的开销。代码在这里:#include#include#defineBLOCKSIZE512__global__voidkernel_parent(int*a,intn,intN);__global__voidkernel_s

c++ - CUDA : NVCC gives controlling expression is constant warning on assert

我在这样的断言语句中收到警告controllingexpressionisconstant:assert(...&&"errormessage");为什么要对这个断言发出警告?我怎样才能抑制这个警告?NVCC是NVIDIA的cuda编译器,我觉得是基于LLVM的。为什么它会发出此警告,而GCC或VisualC++编译器可以正常编译? 最佳答案 可移植的替代方案(可能包含在宏中)类似于:{constboolerror_message=true;assert([...]&&error_message);}澄清我的意思:#definemy

c++ - 你如何计算 nvidia(支持 cuda)的 gpu 卡上的负载?

我想知道如何在向卡发送任务时显示显卡能力的百分比。就像Gnome的系统监视器。此外,如何获取设备参数以根据其硬件规范计算百分比nvidia-smi-a如何获得利用率?是否有CudaAPI可以向卡询问此信息? 最佳答案 ProcessHacker这样做(这仅适用于Windows),但它不是特定于CUDA的。我知道它使用了一些未记录的函数——看看theplugin'ssourcecode了解具体方法。 关于c++-你如何计算nvidia(支持cuda)的gpu卡上的负载?,我们在StackO

c++ - Opencv 错误 : no GPU support (library is compiled without CUDA support)

我正在尝试使用CUDA在GPU上使用opencv处理一些图像处理任务。我正在使用ubuntu。我毫无问题地设置了我的两个产品Opencv和Cuda,我确信这一点。但是,当我尝试在eclipse中运行sampleCOde时,出现错误:OpenCV错误:在mallocPitch中没有GPU支持(库在没有CUDA支持的情况下编译),文件/home/muad/Source/OpenCV-2.4.2/modules/core/src/gpumat.cpp,第749行我重做了我的opencv,但我还是明白了。 最佳答案 如文档中所述,您必须使用

c++ - C/C++ 中的 STL、iostream、new、delete for CUDA

我可以在C/C++中为CUDA使用STL、iostream、new、delete吗? 最佳答案 如果您有Fermi级GPU(因此计算能力>=2.0),并且正在使用CUDA4.0或更高版本,那么new和delete都可以使用在设备代码中。不支持STL容器和算法以及iostream。如果您想对CUDA使用“类似STL”的操作,您可能会对Thrust感兴趣模板库。它允许主机代码使用容器类型透明地与GPU交互,并实现许多非常有用的数据并行原语,如排序、缩减和扫描。请注意,这仍然是主机端设备,不能在您自己的内核代码中使用Thrust及其容器。

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

我有一个相当简单的问题,但我想不出一个优雅的解决方案。我有一个Thrust代码,它生成包含值的相同大小的cvector。假设这些cvector中的每一个都有一个索引。我想为每个vector位置获取值最低的cvector的索引:例子:C0=(0,10,20,3,40)C1=(1,2,3,5,10)作为结果,我会得到一个vector,其中包含具有最低值的Cvector的索引:result=(0,1,1,0,1)我考虑过使用thrustzip迭代器来完成它,但遇到了一些问题:我可以压缩所有cvector并实现一个任意转换,它接受一个元组并返回其最低的索引值,但是:如何迭代元组的内容?据我所知

c++ - 在 CUDA 中使用 SIMD 实现位循环运算符

我知道StackOverflow不是用来向其他人询问代码的,但让我来说说。我正在尝试在CUDAC++设备代码中实现一些AES函数。在尝试实现左字节旋转运算符时,我很不安地看到没有原生的SIMDintrisic。所以我开始了一个天真的实现,但是……它很大,虽然我还没有尝试过,但由于昂贵的拆包/包装,它不会很快……所以,有什么办法吗至少有点效率的每字节位循环操作?如果你不想看,这里是代码。__inline____device__uint32_tper_byte_bit_left_rotate(uint32_tinput,uint8_tamount){return((((input&0xFF

c++ - 在 CUDA 中测试无穷大

在CUDA程序中,我最近使用returnx==INFINITY||x==-INFINITY;INFINITY是从math.h到return!isfinite(x);并且很惊讶地得到了不同的结果。gnu.org表明他们实际上应该表现相似。我错过了什么吗?是否不允许在CUDA内核中使用INFINITY?编辑:我刚刚发现isinf并注意到检查使用returnisinf(x);给出与INFINITY检查相同的结果。为什么不是isfinite(x)==!isinf(x)? 最佳答案 isfinite(a)与!isnan(a)&&!isinf(

c++ - 一个设备的多个 CUDA 上下文——有什么意义吗?

我以为我已经掌握了这一点,但显然我没有:)我需要使用NVENC从编码器不接受的任何格式的帧中执行并行H.264流编码,所以我有以下代码管道:调用通知新帧已到达的回调我将帧复制到CUDA内存并执行所需的颜色空间转换(只有第一个cuMemcpy是同步的,所以我可以从回调中返回,所有未决操作都被推送到专用流中)我将一个事件推送到流上并让另一个线程等待它,一旦它被设置,我就获取CUDA内存指针和正确颜色空间中的帧并将其提供给解码器出于某种原因,我假设如果我在并行线程中执行此管道,则每个线程都需要一个专用上下文。代码很慢,经过一些阅读后我了解到上下文切换实际上很昂贵,然后我得出的结论是它没有意义

c++ - 安装后CUDA编译报错

我想开始使用C++进行CUDA编程,并从Nvidia官方网站安装了工具包v9.0。我在VS2017上运行了deviceQuery.cpp,一切正常:CUDADeviceQuery(RuntimeAPI)version(CUDARTstaticlinking)Detected1CUDACapabledevice(s)Device0:"GeForceGTX960M"CUDADriverVersion/RuntimeVersion9.0/9.0CUDACapabilityMajor/Minorversionnumber:5.0Totalamountofglobalmemory:2048MBy