jjzjj

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++ - 为什么我会收到 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++ - 如何使用 OpenMP 提供的 GPU?

我正在尝试使用OpenMP让一些代码在GPU上运行,但我没有成功。在我的代码中,我使用for循环执行矩阵乘法:一次使用OpenMPpragma标记,一次不使用。(这样我就可以比较执行时间。)在第一个循环之后,我调用omp_get_num_devices()(这是我的主要测试,看看我是否真的连接到GPU。)无论我尝试了什么,omp_get_num_devices()总是返回0。我使用的计算机有两个NVIDIATeslaK40MGPU。CUDA7.0和CUDA7.5在计算机上作为模块提供,CUDA7.5模块通常处于事件状态。gcc4.9.3、5.1.0和7.1.0都可以作为模块使用,gcc

c++ - 是否可以用 C++ 而不是 C 来编写 OpenCL 内核?

我知道有一个openCLC++API,但是我在编译我的内核时遇到了问题...内核必须用C编写吗?那么它只是允许用C++编写的主机代码吗?或者有没有什么方法可以用我找不到的C++编写内核?具体来说,我正在尝试使用pyopencl编译我的内核,但它似乎失败了,因为它将它们编译为C代码。 最佳答案 OpenCLC是C99的子集。还有OpenCLC++(OpenCL2.1和OpenCL2.2规范),它是C++14的子集,但尚未由任何供应商实现(OpenCL2.1部分由Intel实现,但不是C++内核)。宿主代码可以用C、C++、python

c++ - 对任意值类型的操作

这article描述了一种在C#中允许添加任意值类型的方法,这些值类型具有为其定义的+运算符。本质上它允许以下代码:publicTAdd(Tval1,Tval2){returnval1+val2;}此代码无法编译,因为不能保证T类型具有“+”运算符的定义,但效果是通过如下代码实现的:publicTAdd(Tval1,Tval2){//Numdefinesa'+'operationwhichreturnsavalueoftypeTreturn(newNum(val1)+newNum(val2));}点击链接查看Num类如何实现这一点。无论如何,关于这个问题。有什么方法可以在C或C++中实

c++ - 如何在设备内存中有效地随机播放数据?

问题在设备全局内存中移动许多随机(非合并)值时,哪种方法最有效?注意:许多值大于500。上下文我从事GPU的遗传算法实现已有一段时间了,我一直在努力在我的框架的灵active和GPU架构的微优化之间挣扎。GA数据始终驻留在GPU中。只有最佳代解决方案被复制到主机内存。详细场景我正在优化迁移功能。这里基本上很少有数据在设备全局内存中随机播放。但是我以这样的方式获得了我的数据顺序,它为GA运算符内核线程的内存访问方案合并,这使得洗牌一对“基因组”,一个跨越单个FLOAT值的问题,并以相同的跨步方式将它们与另一个基因组交换。已知解决方案问题不在于内存带宽,而是调用延迟和线程阻塞导致进程停滞的

c++ - 计算一个 cuda 内核有多少 block 和线程,以及如何使用它们

我一直在努力弄清楚如何制作一个我认为是简单的内核来取二维矩阵中的值的平均值,但我在直接思考它时遇到了一些问题。根据我的deviceQuery输出,我的GPU有16MP,32cores/mp,block最大为1024x1024x64,我有最大线程/block=1024。所以,我正在处理一些大图像。也许5000pxx3500px或类似的东西。我的一个内核正在对图像中的所有像素取一些值的平均值。现有代码将图像存储为二维数组[行][列]。因此,在C中,内核看起来像您期望的那样,有一个遍历行的循环和一个遍历列的循环,中间有计算。那么如何在CUDA中设置这段代码的维度计算部分呢?我看过SDK中的缩

c++ - 在 CUDA 内核中使用许多固定大小的矩阵

我希望处理大约4000个固定大小(3x3、4x4)的矩阵,进行矩阵求逆和特征分解等操作。在我看来,最好的并行化方法是让许多GPU线程中的每一个线程处理问题的单个实例。有没有合理的方法来做到这一点?我已阅读:http://www.culatools.com/blog/2011/12/09/batched-operations/但据我所知,这始终是“正在努力”但看不到解决方案的事情。三年后,我希望有一个好的解决方案。到目前为止,我看过:在CUDA内核中使用Eigen:http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html.但这还处于起步阶段:

c++ - opencl命令队列是如何工作的,我能问它什么

我正在研究一种算法,它可以多次执行几乎相同的操作。由于该操作由一些线性代数(BLAS)组成,我想我会尝试使用GPU来完成此操作。我已经编写了我的内核并开始将内核推送到命令队列中。因为我不想在每次通话后都等待,所以我想我会尝试将我的通话与事件进行菊花链连接,然后开始将这些事件推送到队列中。callkernel1(returnevent1)callkernel2(waitforevent1,returnevent2)...callkernel1000000(vaitforevent999999)现在我的问题是,是否所有这些都被推送到驱动程序存储队列的图形芯片?它限制了我可以使用的事件数量,