为什么非常简单的Renderscript在GPU上的运行速度比在CPU上慢3倍?
我的测试平台: Development OS: Windows 7 32-bit Phone: Nexus 5 Phone OS version: Android 4.4 SDK bundle: adt-bundle-windows-x86-20131030 Build-tool version: 19 SDK tool version: 22.3 Platform tool version: 19 我写了一个非常简单的renderscript,如下所示: #pragma rs_fp_relaxed uchar4 __attribute__((kernel)) someKernel(uchar4 in, uint32_t x, uint32_t y){ return in; } 我也使用了 adb shell setprop debug.rs.default-CPU-driver 1 强迫脚本在CP​​U上运行以进行性能比较. 我还使用脚本在我
2 2024-02-11
编程技术问答社区
为什么那些谷歌图像处理样本Renderscript在Nexus 5的GPU上运行较慢?
我要感谢Stephen在上一篇文章中的快速回复.这是这篇文章的后续问题为什么非常简单的RenderScript在GPU中的运行速度比CPU慢3倍 我的开发平台如下 Development OS: Windows 7 32-bit Phone: Nexus 5 Phone OS version: Android 4.4 SDK bundle: adt-bundle-windows-x86-20131030 Build-tool version: 19 SDK tool version: 22.3 Platform tool version: 19 为了评估Renderscript GPU计算的性能并掌握通过RenderScript更快地制作代码的一般技巧,我进行了以下测试. 我使用TAG Android-4.2.2_R1.2从Google的Android开源项目中查看了代码.我之所以使用此标签,仅仅是因为图像处理测试样本在较新版本中不可用. 然后,我在测试中使用
2 2024-02-05
编程技术问答社区
为Tegra GPU编程,我需要什么?
我可以在CUDA处理器Tegra 1/2上开发应用程序,我需要什么和什么Tegra 1/2 Cuda-Capibaly? 我只找到了Android Eclipse开发的NVIDIA调试经理,但我不知道他是否可以开发CUDA风格. 解决方案 当前的Tegra处理器(Tegra 1、2和3)不支持CUDA平台.要了解Tegra开发并下载Tegra Android开发套件,请参见其他解决方案 请参阅此处的类似问题/答案: > tegra2 chip chip cuda支持 正如正确指出的Tegra 2/3/4不支持CUDA.洛根将是第一个支持Cuda和Opencl的人. 但是,NVIDIA已经试图将人们与Tegras一起使用CUDA,目前您可以使用Tegra 3加上NVIDIA PCIE图形卡. 有一些支持 的开发板 nvidia jetson: http:///www.toradex.com/products/apalis-arm-computer-m
0 2024-02-03
编程技术问答社区
如何在Android上使用OpenCL?
对于Plattform独立性(桌面,云,移动等),在速度确实很重要时,将OpenCL用于GPGPU开发非常好.我知道Google将RenderScript推定为替代方案,但似乎仅适用于Android,并且不太可能包含在iOS中. 因此,我寻求一个解决方案来执行Android应用程序中的OpenCL代码. 解决方案 我知道唯一的Android设备是基于Mali T600芯片家族的支持OpenCL(文章在这里).他们有一个 opencl sdk .显然它也是OpenCL 1.1完整配置文件. Opencl博客的作者正在尝试>与此相处,因此可能值得关注他的一系列文章. 但是,OpenCL对Android的支持是全新的(截至2013年2月16日),因此,虽然非常适合实验,但在得到更多支持之前,可能值得谨慎(谁说如何对Opencl 1.1进行实力支持.是) 其他解决方案 尽管提出了最初的问题以来的时间已经过去了,但我认为这仍然是许多开发人员的问题. 答案中有
6 2024-01-28
编程技术问答社区
CUDA中的错位地址
任何人都可以告诉我CUDA内核内的以下代码有什么问题: __constant__ unsigned char MT[256] = { 0xde, 0x6f, 0x6f, 0xb1, 0xde, 0x6f, 0x6f, 0xb1, 0x91, 0xc5, 0xc5, 0x54, 0x91, 0xc5, 0xc5, 0x54,....}; typedef unsinged int U32; __global__ void Kernel (unsigned int *PT, unsigned int *CT, unsigned int *rk) { long int i; __shared__ unsigned char sh_MT[256]; for (i = 0; i
4 2024-01-24
编程技术问答社区
用CUDA解决线性系统的QR分解
我正在编写GPU上的图像恢复算法, 中的详细信息 cuda cuda:最小成方求解,速度较差,速度较差 求解线性系统的QR分解方法 Ax=b 工作如下 min||Ax-b|| ---> ||QRx-b|| ---> ||(Q^T)QRx-(Q^T)b|| ---> ||Rx-(Q^T)b|| 其中R是上三角矩阵.所得的上三角线性系统很容易解决. 我想使用Cula工具来实现此方法. CULA例程GEQRF计算QR分解.手册说: 出口,阵列对角线上的元素包含 min(M,N)-by-N上梯形矩阵R(R是上部 三角形如果m >= n);对角线下方的元素, 阵列TAU,代表正交/统一矩阵Q作为产品 min(m,n)基本反射器. 我无法弄清楚Q存储在哪里,对我来说算法似乎太复杂了.你能提供任何建议吗? 谢谢! 解决方案 void GEQRF(int M,int N,T* A,int LDA, T* TAU, T* WORK,int
6 2024-01-22
编程技术问答社区
最快排序的固定长度的6英寸数组
回答另一个堆栈溢出问题(这个)我偶然发现了一个有趣的子问题.排序6个整数的最快方法是什么? 问题非常低: 我们不能假设库可用(呼叫本身具有其成本),只有普通的C 为了避免清空指令管道(具有很高的成本),我们可能应该最大程度地减少分支,跳跃和其他所有类型的控制流动(例如&&中隐藏的序列后面隐藏的那些人或||). 房间受到限制,最小化寄存器,并且使用内存是一个问题,理想情况下,排序可能是最好的. 实际上,这个问题是一种高尔夫球,目标不是最大程度地减少源长度而是执行时间.我称其为" Zening"代码,如书名 noreferrer">代码优化的Zen 作者 Michael Abrash /www.codinghorror.com/blog/2008/02/there-aint-aint-no-such-thing-as-thas-thas-the-fastest-code.html" rel =" noreferrer"> secels . 至于为什么很有趣,有几层
0 2024-01-22
编程技术问答社区
如何在CentOS Linux上检查GPU
建议在Linux上使用命令lspci | grep VGA找到GPU.它在Ubuntu上正常工作,但是当我尝试在CENTOS上使用同样的功能时,它说找不到LSPCI命令.我如何在CentOS上检查GPU卡.并请注意,我不是机器的管理员,我只从命令行远程使用它.我打算将GPU用作该计算机上的GPGPU,但首先我需要检查它是否有一个. 解决方案 您是否尝试启动/sbin/lspci或/usr/sbin/lspci? 其他解决方案 这是您假定您已安装了专有驱动程序,但要发出以下命令... nvidia-smi 输出应该看起来与此相似: Mon Dec 23 10:50:28 2013 +------------------------------------------------------+ | NVIDIA-SMI 331.20 Driver Version: 331.20
4 2023-12-16
编程技术问答社区
进程字符串形成OpenCL内核
有几个字符串,例如 std ::字符串首先,第二,第三; ... 我的计划是将其地址收集到一个char*数组中: char *addresses = {&first[0], &second[0], &third[0]} ... 并将char **地址传递给OpenCL内核. 有几个问题: 主要问题是我无法传递一系列指针. 有什么好方法可以使用内核代码中的多种字符串而不复制它们,但将它们留在共享内存中? 我在Windows上使用NVIDIA.因此,我只能使用opencl 1.2版本. 我不能加入字符串,因为这些字符串来自不同的结构... 编辑: 根据第一个答案,如果我有这个(示例): char *p; cl_mem cmHostString = clCreateBuffer(myDev.getcxGPUContext(), CL_MEM_ALLOC_HOST_PTR, BUFFER_SIZE, NULL, &oclEr
4 2023-12-07
编程技术问答社区
我怎样才能在Windows上用二级GPU覆盖CUDA内核的执行时间限制?
来自NVIDIA网站,它解释了超时问题: 问:最大内核执行时间是多少?在窗户上,个人 GPU计划启动的最大运行时间约为5秒. 超过此时间限制通常会导致报告的发布失败 通过CUDA驱动程序或CUDA运行时,但是在某些情况下可以 悬挂整个机器,需要硬重置.这是由 Windows"看门狗"计时器,该计时器会导致使用主机 图形适配器如果运行长于最大值,则可以超时 允许的时间. 因此,建议CUDA在GPU上运行 未连接到显示器,也没有Windows桌面 延伸到它上.在这种情况下,系统必须至少包含一个 NVIDIA GPU作为主要图形适配器. 来源: https://develoveler.nvidia.com/cuda-faq 因此,Nvidia相信,或者至少强烈暗示具有多(NVIDIA)GPU,并且具有适当的配置,可以防止这种情况发生吗? 但是如何?到目前为止,我尝试了很多方法,但是在GK110 GPU上仍然存在令人讨厌的超时:(1)插入次级PCIE 16X插槽;
0 2023-12-05
编程技术问答社区
如何在Linux中获取已安装的Vulkan API的版本?
2018-03-07,发布了新版本的API(Vulkan 1.1). 我想知道: 哪个控制台命令可以显示当前安装的API版本. $ /usr/bin/vulkaninfo | head -n 5 =========== VULKAN INFO =========== Vulkan Instance Version: 1.1.70 WARNING: radv is not a conformant vulkan implementation, testing use only. 如何以编程方式在C#语言中确定相同的内容. 解决方案 Vulkan版本由多个因素确定.这取决于您的设备支持的内容,所使用的标题以及创建应用程序时请求的API版本. "已安装"版本是您正在使用的SDK,或者是(S)驱动程序确实安装的运行时. 可以使用lunarg sdk的vksjon_info工具进行检查. 通过代码检查(无论您使用哪种语言,只要您获得标题),可以通过通过v
0 2023-11-26
编程技术问答社区
Vulkan计算着色器用于并行的总和减少
我想实现此算法 https://dournac.org/info/gpu_sum_sum_reduction 在Vulkan的计算着色器中.在Opencl中,这很容易,因为我可以明确声明 哪些缓冲区是__local,哪些是__global.不幸的是,我似乎找不到 Vulkan的任何此类机制.有人可以经验丰富,向我展示一个例子,请问如何在Vulkan工作? 解决方案 Vulkan中的亚组似乎等效功能.这是一个功能,可以在子组中配合着色器调用. 也许类似: void main(){ int partial_sum = subgroupAdd(arr[gl_GlobalInvocationID.x]); if (subgroupElect()) { atomicAdd(mem, partial_sum); } } 您可以学习 subgroup教程. 然后,您可以简单地尝试使用"正常"方式: void main(){
4 2023-11-26
编程技术问答社区
什么是GPU上的相干内存?
我没有一次偶然发现 中的"非连贯"和"连贯"内存 技术论文与Graphics编程有关发现 type.i很高兴收到Layman's会很高兴,样式答案是关于GPU体系结构上实际上是什么相干内存以及与其他(可能不连接)内存类型相比的样式. 解决方案 内存是内存.但是不同的东西可以访问该内存. GPU可以访问内存,CPU可以访问内存,也许可以访问其他硬件位. 如果其他人对该内存进行的更改对读者可见,则具有"连贯"对内存的"连贯"访问.现在,您可能会认为这是愚蠢的.毕竟,如果内存已更改,那么某人可能如何看不到它? 简单地放置,缓存. 事实证明,变化的内存很昂贵.因此,除非我们绝对必须这样做,否则我们会尽一切可能避免更改内存.当您将单个字节从CPU写到内存中的指针时,CPU还没有写入该字节.或至少不是记忆.它将其写入该内存的本地副本,称为"缓存". 这样做的原因是,一般来说,应用程序不会写(或读取)单个字节.他们更有可能在小块中写(和阅读)很多字节.因此,如果您要
2 2023-11-26
编程技术问答社区
什么时候与寄存器/局部变量一起使用volatile?
用挥发性预选赛在CUDA中声明寄存器数组的含义是什么? 当我尝试使用寄存器数组的挥发性关键字尝试时,它将溢出寄存器内存的数量删除到本地内存. (即迫使CUDA使用寄存器代替本地记忆)这是预期的行为吗? 我找不到有关CUDA文档中登记阵列的挥发性用法的任何信息. 这是两个版本的PTXA -V输出 带有挥发性预选赛 __volatile__ float array[32]; ptxas -v输出 ptxas info : Compiling entry function '_Z2swPcS_PfiiiiS0_' for 'sm_20' ptxas info : Function properties for _Z2swPcS_PfiiiiS0_ 88 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads ptxas info : Used 47 registe
10 2023-11-25
编程技术问答社区
什么时候在共享CUDA内存中使用volatile?
在什么情况下,您应该将volatile关键字与CUDA内核共享内存?我了解volatile告诉编译器永远不要缓存任何值,但是我的问题是关于具有共享数组的行为: __shared__ float products[THREADS_PER_ACTION]; // some computation products[threadIdx.x] = localSum; // wait for everyone to finish their computation __syncthreads(); // then a (basic, ugly) reduction: if (threadIdx.x == 0) { float globalSum = 0.0f; for (i = 0; i
10 2023-11-25
编程技术问答社区
在Visual Studio 2010下使用NVIDIA工具扩展
我正在尝试使用NVIDIA工具扩展名来对CUDA代码进行更准确的性能评估.我正在使用Visual Studio 2010来开发代码. 要为此功能设置Visual Studio 2010,我添加了 Properties -> Linker -> General -> Additional Library Directories -> $(NVTOOLSEXT_PATH)\lib\$(Platform); Properties -> Linker -> General -> Input -> Additional Dependencies -> nvToolsExt32_1.lib; 但是,当我使用 时 #include 编译器说 Error 1 error C1083: Cannot open include file: 'nvToolsExt': No such file or directory 环境变量NVTOOL
6 2023-11-23
编程技术问答社区
从cuda内核打印
我正在编写CUDA程序,并尝试使用PrintF函数在CUDA内核中打印一些东西.但是当我编译程序时,我会遇到错误 error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ProgramData\N
0 2023-11-23
编程技术问答社区
在iPhone的GPU上解码视频帧
我正在寻找最快的方法来解码iPhone上本地的MPEG-4视频帧.我只是对每10帧中像素的亮度值感兴趣.我不需要在任何地方渲染视频. 我已经尝试了FFMPEG,AvassetReader,ImageAssetGenerator,OpenCV和MPMoviePlayer,但它们都太慢了.我能获得的最快速度是〜2倍(一分钟内扫描2分钟的视频).我想要更接近10倍的东西. 假设我的尝试没有使用GPU,是否有任何方法可以通过在GPU上运行的东西来实现我的目标? OpenGL似乎主要用于渲染输出,但我认为它用作传入视频的过滤器.也许这是一个选择? 预先感谢! 解决方案 如果您愿意使用仅iOS 5解决方案,请查看2011年WWDC会话中的示例应用程序Chromakey. 该演示从内置摄像头捕获了30 fps的视频,并将每个帧传递到OpenGL作为纹理.然后,它使用OpenGL来操纵框架,并选择将结果写入输出视频文件. 该代码使用一些严重的低级魔术来绑定核心视频像
2 2023-11-18
编程技术问答社区