gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:50 25 4
gpt4 key购买 nike

在我的笔记本电脑上,我有两张图形卡-Intel Iris和Nvidia GeForce GT 750M。我正在尝试使用OpenCL做一个简单的 vector 添加。我知道Nvidia卡的速度要快得多,并且可以做得更好。原则上,我可以在代码中放置if语句,以便在NVIDIA属性中查找VENDOR。但是我想要些优雅的东西。在OpenCL C/C++中以编程方式选择更好(更快)GPU的最佳方法是什么?

最佳答案

我开发了一个实时光线跟踪器(不仅仅是光线转换器),该跟踪器以编程方式选择了两个GPU和一个CPU,并实时渲染和平衡了这三个负载。这是我的方法。

假设有三种设备,d1d2d3。为每个设备分配一个权重:w1w2w3。调用要渲染的像素数n。假设有一个名为alpha的自由参数。

  • 为每个设备分配权重1/3。
  • alpha = 0.5
  • 渲染n1=w1*n上的第一个d1像素,n2=w2*n上的下一个d2像素和n3=w3*n上的最后一个d3像素,并记录每个设备t1t2t3的渲染时间。
  • 计算值vsum = n1/t1 + n2/t2 + n3/t3
  • 重新计算权重w_i = alpha*w_i + (1-alpha)*n_i/t_i/vsum
  • 返回步骤3。

  • alpha的目的是允许平滑过渡。与其根据所有旧权重中混合的时间来重新分配所有权重。没有使用 alpha我就变得不稳定。值 alpha可以调整。实际上,可以将其设置为1%左右,但不能设置为0%。

    让我们选择一个例子。

    我有一个GTX 590,它是一个双GPU卡,带有两个时钟不足的GTX580。我也有一个Sandy Bridge 2600K处理器。 GPU比CPU快得多。假设它们快10倍左右。假设还有900个像素。

    使用GPU1渲染前300个像素,使用GPU2渲染接下来的300像素,使用CPU1渲染最后300个像素,并分别记录 10 s, 10 s, and 100 s的时间。因此,一个GPU用于整个图像的时间为30 s,而仅CPU的时间为300 s。两个GPUS一起使用 15 s

    计算 vsum = 30 + 30 + 3 = 63。再次重新计算权重: w1,w2 = 0.5*(1/3) + 0.5*300/10/63 = 0.4w3 = 0.5*(1/3) + 0.5*300/100/63 = 0.2

    渲染下一帧:GPU1为360像素,GPU2为360 PIXELS,CPU1为180 PIXELS,使用 11 s, 11 s, and 55 s可以使时间变得更加平衡。

    在许多帧之后, (1-alpha)术语占主导地位,直到最终权重全部基于该术语。在这种情况下,权重分别变为47%(427像素),47%,6%(46像素),时间分别变为 14 s, 14 s, 14 s。在这种情况下,CPU仅将仅使用GPU的结果提高了1秒钟。

    在此计算中,我假设负载是均匀的。在真实的光线跟踪器中,负载随扫描线和像素的不同而变化,但是用于确定权重的算法保持不变。

    在实践中,一旦找到权重,除非场景的负载发生显着变化,例如,它们不会改变很多。如果场景的一个区域具有较高的折射和反射率,而其余区域是漫反射的,但是即使在这种情况下,我也限制了树的深度,因此不会产生太大的影响。

    通过循环将这种方法扩展到多个设备很容易。我曾经在四台设备上测试过我的光线跟踪器。两个12核Xeon CPU和两个GPU。在这种情况下,CPU的影响更大,但GPU仍占主导地位。

    万一有人想知道。我为每个设备创建了一个上下文,并在单独的线程(使用pthreads)中使用了每个上下文。对于三个设备,我使用了三个线程。

    实际上,您可以使用它在不同供应商的同一设备上运行。例如,我在2600K上同时使用了AMD和Intel CPU驱动程序(每个驱动程序生成大约一半的帧),以查看哪个供应商更好。当我第一次这样做时(2012年),如果我没记错的话,讽刺的是,AMD在Intel CPU上击败了Intel。

    如果有人对我如何提出权重公式感兴趣,我会使用物理学中的一个想法(我的背景是物理学而不是编程)。

    速度( v)=距离/时间。在这种情况下,距离( d)是要处理的像素数。则总距离为
    d = v1*t1 + v2*t2 + v3*t3

    我们希望他们每次都同时完成
    d = (v1 + v2 + v3)*t

    然后得到重量定义
    v_i*t = w_i*d

    这使
    w_i = v_i*t/d

    并从( t/d)替换( d = (v1 + v2 + v3)*t)得到:
    w_i = v_i /(v1 + v2 + v3)

    很容易看出这可以推广到任意数量的设备 k
    w_i = v_i/(v1 + v2 + ...v_k)

    因此,我算法中的 vsum代表“速度之和”。最后,由于 v_i是随时间变化的像素,因此 n_i/t_i最终给出了
    w_i = n_i/t_i/(n1/t1 + n2/t2 + ...n_k/t_k)

    这是我公式中用于计算权重的第二项。

    关于c++ - 在OpenCL中以编程方式选择最佳GPU的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333468/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com