我一直在玩一个访问7个全局内存缓冲区的OpenCL内核,对值做一些事情并将结果存储回第8个全局内存缓冲区.正如我所观察到的,随着输入大小的增加,L1缓存未命中率(=未命中(未命中+命中))变化很大.我找不到这种变化的来源.此处的输入大小表示全局工作项的数量(2的幂和工作组大小的倍数).工作组大小的数量仍为256.
这些是结果.这些显示了L1缓存未命中率.从4096个工作项(16个工作组)开始.
0.677125
0.55946875
0.345994792
0.054078125
0.436167969
0.431871745
0.938546224
0.959258789
0.952941406
0.955016479
Run Code Online (Sandbox Code Playgroud)
分析器说它每个线程使用18个寄存器.这是代码(函数TTsum()应该只做一堆依赖的超越操作,所以它与缓存无关)我猜:
float TTsum(float x1, float x2, float x3, float x4, float x5, float x6, float x7)
{
float temp = 0;
for (int j = 0; j < 2; j++)
temp = temp + x1 + (float)x2 + x3 + x4 + x5 + x6 + x7;
temp = sqrt(temp);
temp = exp(temp);
temp = temp / x1;
temp = temp / (float)x2;
for (int j = 0; …Run Code Online (Sandbox Code Playgroud) 为了减少我的应用程序从主机到设备的传输时间,我想使用固定内存.NVIDIA的最佳实践指南建议使用以下代码映射缓冲区并写入数据:
cDataIn = (unsigned char*)clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE,CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);
for(unsigned int i = 0; i < memSize; i++)
{
cDataIn[i] = (unsigned char)(i & 0xff);
}
clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0,
szBuffBytes, cDataIn, 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
英特尔的优化指南建议使用对clEnqueueMapBuffer和clEnqueueUnmapBuffer的调用,而不是调用clEnqueueReadBuffer或clEnqueueWriteBuffer.
使用固定内存/映射内存的正确方法是什么?是否有必要使用enqueueWriteBuffer写入数据或者enqueueMapBuffer是否足够?
另外,CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR之间有什么区别?
我刚才注意到WD Hillis的Connection-Machine的第一批语言之一是*Lisp,它是具有并行结构的Common Lisp的扩展.Connection-Machine是一台具有SIMD架构的大规模并行计算机,与现代GPU卡非常相似.
因此,我希望将*Lisp改编为GPGPU - 可能是nVidia CUDA,因为它是最先进的事实标准 - 非常自然.
到目前为止,除了用于C/C++的nVidia SDK之外,我还发现了Python环境PyCUDA.有没有人听说过Lisp?
据我所知,GPU在warp之间切换以隐藏内存延迟.但我想知道在哪种条件下,经线会被切换掉?例如,如果warp执行加载,并且数据已经存在于缓存中.那么warp是否已经关闭或继续下一次计算?如果连续两次添加会发生什么?谢谢
我对GPU没有太多经验,所以请原谅我的无知.如今,GPU被用作GPGPU用于通用编程.但我想知道GPU是否具有内存保护和虚拟化机制.我的意思是,例如,你在GPU上运行两个内核,如果你没有vritualization和内存保护,可以很容易地写入另一个地址.这个问题怎么解决了?是否已经完成了提高GPU上运行的代码可靠性的工作?可以通过一些沙盒机制同时运行两个内核吗?
在NVIDIA Visual Profiler(运行相同的 .exe)中,在命令行上花费超过1分钟的代码片段在几秒钟内完成.所以自然的问题是为什么?命令行是否有问题,或者Visual Profiler是否做了不同的事情并且没有真正执行命令行中的所有内容?
我正在使用CUBLAS,Thrust和cuRAND.
顺便说一句,最近我的机器上的编译代码明显减慢,甚至以前运行得很快的旧代码,因此我开始怀疑.
更新:
cudaFree(0)调用时出现峰值).在Visual Profiler中,这个数字下降到~100MB.长话短说,我已经完成了几个交互式软件的原型.我现在使用pygame(python sdl包装器),一切都在CPU上完成.我现在开始将它移植到C,同时寻找现有的可能性来使用一些GPU功能来从冗余操作中吸收CPU.但是,我找不到一个好的"指南",在我的情况下,我应该选择哪些确切的技术/工具.我只是阅读了大量的文档,它很快就耗尽了我的智力.我不确定它是否可能,所以我很困惑.
在这里,我对我开发的典型应用程序框架做了一个非常粗略的草图,但考虑到它现在使用GPU(注意,我几乎没有关于GPU编程的实用知识).仍然重要的是必须精确保留数据类型和功能.这里是:

因此F(A,R,P)是一些自定义函数,例如元素替换,重复等.函数在程序生命周期中可能是恒定的,矩形的形状通常不等于A形状,因此它不是就地计算.所以它们只是根据我的功能生成的.F的例子:A的重复行和列; 用替换表中的值替换值; 将一些瓷砖组成单个阵列; 关于A值等的任何数学函数.如上所述,这一切都可以在CPU上轻松完成,但应用程序必须非常流畅.在纯Python中BTW在添加了几个基于numpy数组的视觉特性后变得无法使用.Cython有助于快速定制功能,但源代码已经是一种沙拉.
题:
这个架构是否反映了一些(标准)技术/ dev.tools?
CUDA是我要找的吗?如果是,那么与我的应用程序结构一致的一些链接/示例将是很好的.
我意识到,这是一个很大的问题,所以如果有帮助,我会提供更多细节.
更新
下面是我的位图编辑器原型的两个典型计算的具体示例.因此编辑器使用索引,数据包括具有相应位掩码的层.我可以确定图层和蒙版的大小与图层大小相同,例如,所有图层的大小相同(1024 ^ 2像素 = 32位值为4 MB).我的调色板就是1024个元素(4个千字节,32 bpp格式).
考虑我现在要做两件事:
第1步.我想将所有图层拼合在一起.假设A1是默认层(背景),层'A2'和'A3'有掩码'm2'和'm3'.在python我写道:
from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3
Run Code Online (Sandbox Code Playgroud)
由于数据是独立的,我认为它必须与并行块的数量成比例加速.
第2步.现在我有一个数组,并希望用一些调色板"着色"它,所以它将是我的查找表.正如我现在看到的,查找表元素的同时读取存在问题.

但我的想法是,可能只需复制所有块的调色板,因此每个块都可以读取自己的调色板?像这样:

我想知道使用GPGPU可以实现哪种财务应用程序.我知道使用CUDA在GPGPU上使用蒙特卡罗模拟进行期权定价/股票价格估算.有人可以枚举将GPGPU用于财务领域的任何应用程序的各种可能性,