草庐IT

c++ - VexCL 中的密集矩阵 vector 乘法

VexCL似乎是一个非常有吸引力的gpu编程库。不幸的是,这是一个非常年轻的图书馆,那里的信息很少。我一直在寻找如何执行矩阵vector乘法,但我发现的唯一矩阵表示是vex::SpMat,它包含一个稀疏矩阵。如果矩阵是稠密的,那么通常情况下,稀疏表示的计算效率较低。我所有的矩阵都是密集的,我想知道如何在VexCL中有效地执行它。 最佳答案 我是VexCL的开发者图书馆。我不得不承认密集的线性代数运算不在我的优先列表中。我认为很难以一种在VexCL(即OpenCL/CUDA)支持的各种设备之间实现性能可移植的方式来实现它们。此任务可能

c++ - 在OpenCL中以编程方式选择最佳GPU的最佳方法是什么?

在我的笔记本电脑上,我有两张图形卡-IntelIris和NvidiaGeForceGT750M。我正在尝试使用OpenCL做一个简单的vector添加。我知道Nvidia卡的速度要快得多,并且可以做得更好。原则上,我可以在代码中放置if语句,以便在NVIDIA属性中查找VENDOR。但是我想要些优雅的东西。在OpenCLC/C++中以编程方式选择更好(更快)GPU的最佳方法是什么? 最佳答案 我开发了一个实时光线跟踪器(不仅仅是光线转换器),该跟踪器以编程方式选择了两个GPU和一个CPU,并实时渲染和平衡了这三个负载。这是我的方法。

c++ - OpenCL 或 CUDA 调用的开销?

我正在编写一个函数来处理很多BLASgemv操作。我希望能够在GPU上执行此操作,并且我已尝试使用cuBlas。我的问题是我的矩阵和vector相当小,100x100矩阵和100vector。与CPU相比,CuBlas需要很长时间,我知道为什么,CPU上的快速缓存和调用GPU的大量开销混合在一起。因此,我正在尝试找出一种聪明的方法来测量将调用传递给GPU所需的时间。这是CUDA设置调用并将其发送到图形处理器所花费的时间——不包括执行矩阵vector乘法实际花费的时间。我该怎么做? 最佳答案 更新:以下结果是针对2005硬件(nVid

c++ - 部署 OpenCL 应用程序?

我目前正在学习OpencL,但发现理解它的实际工作原理有些困难。我正在使用带有ATIAPPSDK的MinGW编译器。当我运行目标时,我收到错误消息我没有将任何OpenCL.dll放在与我的应用程序相同的文件夹中。现在在Windows上搜索一下,我可以在中找到这个dllC:/Windows/SysWOW64C:/Windows/System32/DriverStore/...C:/Windows/System32C:/ProgramFiles(x86)/AMDAPPSDK/...所以我的问题是我应该如何部署我的应用程序?我应该随我的应用程序分发OpenCL.dll吗?

c++ - 使用 clEnqueueWriteBuffer 的内存损坏 - OpenCL

我正在编写一些从主机向设备发送大量数据的代码,但它的行为不稳定。在下面的代码中,我试图从主机向设备发送一个数组。数组大小在每次迭代中递增,逐渐增加发送到设备的内存量。数组中的第一个元素填充了一个非零值,它从内核内部读取并打印到控制台。从主机和设备读取的值应该相同,但在某些迭代中却不同。代码如下:intSizeArray=0;for(intj=1;j测试此代码的设备具有以下功能:-Name:Intel(R)HDGraphics4000-DeviceVersion:OpenCL1.1-DriverVersion:8.15.10.2696-MaxMemoryAllocationSize:42

c++ - 为什么我会收到 CL_MEM_OBJECT_ALLOCATION_FAILURE?

我在GPU上分配一个cl_mem缓冲区并对其进行处理,在超过一定尺寸之前效果很好。在那种情况下,分配本身会成功,但执行或复制不会。我确实想使用设备的内存来加快操作速度,所以我分配如下:buf=clCreateBuffer(cxGPUContext,CL_MEM_WRITE_ONLY,buf_size,NULL,&ciErrNum);现在我不明白的是大小限制。我正在复制大约16MB,但应该可以使用大约128MB(参见CL_DEVICE_MAX_MEM_ALLOC_SIZE)。为什么这些数字相差如此之大?这是oclDeviceQuery的一些摘录:CL_PLATFORM_NAME:NVID

c++ - 数组大小和复制性能

我确定之前已经回答过这个问题,但我找不到好的解释。我正在编写一个图形程序,其中一部分管道正在将体素数据复制到OpenCL页锁定(固定)内存。我发现这个复制过程是一个瓶颈,并对简单的std::copy的性能进行了一些测量。数据是float的,我要复制的每个数据block的大小约为64MB。这是我的原始代码,在进行任何基准测试之前:std::copy(data,data+numVoxels,pinnedPointer_[_index]);data是浮点指针,numVoxels是无符号整数,pinnedPointer_[_index]是引用固定OpenCL缓冲区的浮点指针.由于我的性能很慢,

C++ 模板预处理器工具

是否有编译器或独立预处理器可以获取C++文件并运行模板扩展过程,从而生成带有扩展模板实例化的新C++代码?我记得在20世纪90年代中期有这样一个工具,当时模板仍然是新的和实验性的,预处理器是一种在没有native模板支持的情况下使用编译器进行模板编程的方法。这比宏处理步骤复杂得多,因为它可能需要解析和标记代码以理解上下文。我希望在编写OpenCL代码时使用这样的工具。OpenCL是C++,但不支持模板。我希望我可以编写模板,即使是简单的模板,比如只有整数或bool参数,并有一些工具预解析文件并通过并找到模板的使用并扩展调用并给我新的C++代码OpenCL编译器可以理解。即使是一个非常有

c++ - 有什么方法可以阻止 OpenCL 内核执行?

有什么方法可以阻止OpenCL内核执行?例如,我启动内核,进行一些计算,然后在满足某些条件时停止它,否则,我等到它完成:clEnqueueNDRange(queue,...);//startkernelfunction//dootherstuff...//...if(someconditionmet){stopKernel();}else{clFinish(queue);}谢谢你的帮助 最佳答案 没有。将内核加入队列后,它将运行至完成。完成上述事情的一种方法是这样做:while(data_left_to_process){clEnq

c++ - 当运行的线程多于内核时,CUDA 性能会提高

为什么每个block运行超过32个线程时性能会提高?我的显卡有480个CUDA内核(15MS*32SP)。 最佳答案 每个SM有1-4个warp调度器(Tesla=1,Fermi=2,Kepler=4)。每个warp调度程序负责执行分配给SM的warp的子集。每个warp调度程序维护一个符合条件的warp列表。如果warp可以在下一个周期发出指令,则它是合格的。如果warp在数据依赖性上停止,等待获取和指令,或者下一条指令的执行单元正忙,则warp不合格。在每个周期中,每个warp调度程序将从符合条件的warp列表中选择一个warp