您好:OpenCL中全局工作量(维度)是否需要是工作组大小(维度)的倍数?
如果是这样,是否有一种处理矩阵的标准方法而不是工作组维度的倍数?我可以想到两种可能性:
动态地将工作组维度的大小设置为全局工作维度的因子.(这会产生查找因子的开销,并可能将工作组设置为非最佳大小.)
将全局工作的维度增加到工作组维度的最接近倍数,保持所有输入和输出缓冲区相同但检查内核中的边界以避免segfaulting,即对所需输出超出工作项的任何操作.(这似乎是更好的方式.)
第二种方式会起作用吗?有没有更好的办法?(或者它是否没有必要,因为工作组维度不需要划分全球工作维度?)
谢谢!
我正在尝试开发一个iOS应用程序,它可以对摄像机的视频执行实时特效,就像iPad上的Photobooth一样.我熟悉OpenCV的API,但如果在CPU和GPU上完成大部分处理,我担心iOS上的性能.像GPUImage这样的图书馆最有可能做到这一点,但我宁愿留下我熟悉的东西.那么,有没有人知道为iOS编译的OpenCV是否使用GPU?
如何映射系统内存(RAM)以进行GPU访问?我很清楚虚拟内存如何为cpu工作,但我不确定当GPU访问GPU映射系统内存(主机)时它会如何工作.基本上与数据如何从系统内存复制到主机内存有关,反之亦然.你能提供参考文章支持的解释吗?
我正在构建一个需要在画布上进行大量绘制的应用程序.我注意到应用程序在高分辨率设备(例如nexus 7)中有点滞后.我看到开发人员选项中有一个Force GPU选项.启用强制GPU后,我的应用程序运行绝对流畅.
我已经读过这个Force GPU选项被称为硬件加速,它仅适用于Android 3.0及更高版本.
我的应用针对Android 2.3及更高版本.
是否有可能在任何Android 3.0或更高版本的设备上以编程方式启用硬件加速(或强制GPU - 无论魔法是什么)?
就像是:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
Turn On Hardware Accelerate HERE but How can i do this?
any code snippet would be welcome/helpful/thanks
}
Run Code Online (Sandbox Code Playgroud) 有人知道如何在Ubuntu 12.10下禁用或更改CUDA内核的超时限制吗?(使用当前版本的Windows,可以在注册表中设置超时限制.)
如果没有可能与Ubuntu这样做,请告诉我.
我之前搜索的唯一结果如下:
这两个解决方案对我来说都没有选择,因为我需要为我的应用程序提供图形显示,并且在内核执行期间已经没有线程在一个接一个地运行.拆分单个线程将耗费数月的工作量.请不要进一步询问这些方向的详细信息.
感谢您的帮助.
我准备为我的电脑构建一个流光溢彩的克隆.为此,我需要一种方法来计算屏幕几个区域的平均颜色.
到目前为止我发现的最快方法如下:
pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH/*D3DPOOL_SYSTEMMEM*/, &pSurface, nullptr)
pd3dDevice->GetFrontBufferData(0, pSurface);
D3DLOCKED_RECT lockedRect;
pSurface->LockRect(&lockedRect, nullptr, D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
memcpy(pBits, (unsigned char*) lockedRect.pBits, dataLength);
pSurface->UnlockRect();
//calculate average over of pBits
Run Code Online (Sandbox Code Playgroud)
然而,它会将整个前端缓冲区复制回系统内存,平均需要33毫秒.显然33ms并不接近我需要的速度,因此我正在寻找一种方法来直接在gpu上计算前缓冲区域的平均值,而无需将前缓冲区复制回系统内存.
编辑:代码片段中的瓶颈是pd3dDevice->GetFrontBufferData(0, pSurface);.memcpy对性能没有明显影响.
编辑:
根据user3125280的回答,我制作了一些代码,它们应该占据屏幕的左上角并对其进行平均.但结果总是0.我错过了什么?另外请注意,pSurface现在它已经存在于视频内存中,因此GetFrontBufferData只是视频内存中的一个内存非常快.
pd3dDevice->CreateOffscreenPlainSurface(1, 1, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pAvgSurface, nullptr);
pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pSurface, nullptr);
pd3dDevice->GetFrontBufferData(0, pSurface);
RECT r;
r.right = 100;
r.bottom = 100;
r.left = 0;
r.top = 0;
pd3dDevice->StretchRect(pSurface, &r, pAvgSurface, nullptr, D3DTEXF_LINEAR);
D3DLOCKED_RECT lockedRect;
pAvgSurface->LockRect(&lockedRect, nullptr, D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
unsigned int color = -1; …Run Code Online (Sandbox Code Playgroud) 有没有办法让Java应用程序在mac上使用集成的GPU而不是离散的GPU?
(我对发布不会将用户的Mac笔记本电脑推向离散模式的应用程序感兴趣,而不是在我自己的笔记本电脑上为所有应用程序锁定集成模式的方法,例如gfxCardStatus.)
我知道完整的GPU是计算的庞然大物 - 包括计算的每一步和内存.显然,GPU可以计算我们想要的任何东西 - 它是图灵完成的.
我的问题是关于各种GPU上的单个着色器("流处理器"/"CUDA核心"):
图灵是否完整?
我(理论上)可以使用单个着色器计算任意输入上的任意函数吗?
我试图了解计算着色器的"规模".
建立:
一切正常,但是当我增加批量大小以加快训练时,我在大型模型上耗尽了视频内存.我认为转向4 GPU系统理论上可以提高可用的总内存或允许更小的批量构建更快,但是观察nvidia统计数据,我可以看到默认情况下只使用一个GPU:
+------------------------------------------------------+
| NVIDIA-SMI 361.42 Driver Version: 361.42 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GRID K520 Off | 0000:00:03.0 Off | N/A |
| N/A 44C P0 45W / 125W | 3954MiB / 4095MiB | 94% Default |
+-------------------------------+----------------------+----------------------+
| 1 …Run Code Online (Sandbox Code Playgroud) 我有一些代码可以计算一个矩阵中每个笛卡尔坐标与另一个矩阵中其他坐标之间的距离。对于每个坐标,将返回最小距离以及产生最小坐标的索引位置。
function MED3D(m1, m2)
n1::Int = size(m1,1)
Dist = SharedArray{Float64}((n1,3))
@sync @distributed for k in 1:n1
Dist[k,:] = MD3D(m1[k,:], m2, k)
end
return Dist
end
@everywhere function MD3D(v1, m2, k)
dsum::Float64 = Inf
dtemp::Float64 = Inf
i = 0
for j in 1:size(m2,1)
@inbounds dtemp = sqrt((v1[1] - m2[j,1]) * (v1[1] - m2[j,1]) + (v1[2] - m2[j,2]) * (v1[2] - m2[j,2]) + (v1[3] - m2[j,3]) * (v1[3] - m2[j,3]))
if dtemp < dsum
dsum = dtemp
i = j
end …Run Code Online (Sandbox Code Playgroud)