我想开展一个长达2-3个月的项目(全职),涉及用C++编码,并与网络(协议栈)相关.我正在考虑编写自己的网络堆栈,但这看起来并不那么有趣.很高兴找到一个为分布式系统/ GPU实现类似tcp/ip的堆栈的想法,就网络性能而言更好.我一直在谷歌搜索3个小时,但没有看到任何看起来值得花2个月的东西.像netperf这样的开源项目似乎超出了我的范围.我真的很喜欢一个相对较小的独立项目,我可以按照自己的步调进行工作.这个项目的目的是利用我的项目空闲时间(我可能稍后在开源许可下发布),并获得C++,网络,并行编程,GPU,分布式系统等方面的专业知识和实践经验.
我似乎在找到想法时遇到了障碍(或者我可能不太清楚我究竟该做什么).所以任何建议都会非常感激.谢谢!
一位电气工程师最近告诫我不要使用GPU进行科学计算(例如,准确性非常重要),因为没有像CPU那样的硬件保护措施.这是真的,如果是这样,典型硬件中的问题有多常见/实质性?
需要使用哪些库或函数来客观地比较CPU和GPU性能?为了准确评估,应该警告什么警告?
我使用Ubuntu平台和具有计算能力的设备2.1并使用CUDA 5工具包.
我有一个应用程序,我在用户系统上的GPU之间分配处理负载.基本上,每个GPU都有CPU线程,当主应用程序线程定期触发时,它会启动GPU处理间隔.
考虑以下图像(使用NVIDIA的CUDA探查器工具生成)作为GPU处理间隔的示例- 此处应用程序使用单个GPU.

正如您所看到的,两个排序操作消耗了大部分GPU处理时间,而我正在使用Thrust库(thrust :: sort_by_key).此外,看起来push :: sort_by_key会在启动实际排序之前调用几个cudaMallocs.
现在考虑应用程序在两个GPU上分散处理负载的相同处理间隔:

在完美的世界中,您可以预期2 GPU处理间隔恰好是单GPU的一半(因为每个GPU的工作量只有一半).正如你所看到的,部分原因并非如此,因为cudaMallocs由于某种争用问题而被同时调用(有时长2-3倍)时似乎需要更长的时间.我不明白为什么会出现这种情况,因为2个GPU的内存分配空间是完全独立的,因此cudaMalloc上不应该有系统范围的锁定 - 每GPU锁定会更合理.
为了证明我的假设问题是同时使用cudaMalloc调用,我创建了一个非常简单的程序,它有两个CPU线程(每个GPU),每个线程多次调用cudaMalloc.我首先运行此程序,以便单独的线程不会同时调用cudaMalloc:

你看,每次分配需要大约175微秒.接下来,我用同时调用cudaMalloc的线程运行程序:

在这里,每个呼叫比前一个案例花了大约538微秒或3倍!毋庸置疑,这极大地减慢了我的应用程序,并且理所当然,只有2个以上的GPU才会使问题变得更糟.
我在Linux和Windows上注意到了这种行为.在Linux上,我使用的是Nvidia驱动程序版本319.60,而在Windows上我使用的是327.23版本.我正在使用CUDA工具包5.5.
可能的原因: 我在这些测试中使用的是GTX 690.这张卡基本上是2 680个GPU,安装在同一个单元中.这是我运行的唯一"多GPU"设置,所以cudaMalloc问题可能与690的2 GPU之间的硬件依赖性有关吗?
我在我的项目中研究了cuDNN库的使用.但我的nvidia显卡有点旧.
如果cuDNN适用于所有图形卡,我在网上搜索.即使在他们的主页中我也找不到.
哪些nvidia显卡与cuDNN兼容?
我正在GPU上分配一个cl_mem缓冲区并对其进行处理,它可以正常工作,直到超过一定的大小.在这种情况下,分配本身成功,但执行或复制不成功.我确实想要使用设备的内存以便更快地操作,所以我分配如下:
buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);
Run Code Online (Sandbox Code Playgroud)
现在我不明白的是尺寸限制.我正在复制大约16 MB但应该可以使用大约128 MB(参见参考资料CL_DEVICE_MAX_MEM_ALLOC_SIZE).
为什么这些数字差异如此之大?
以下是oclDeviceQuery的一些摘录:
CL_PLATFORM_NAME: NVIDIA
CL_PLATFORM_VERSION: OpenCL 1.0
OpenCL SDK Version: 4788711
CL_DEVICE_NAME: GeForce 8600 GTS
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
CL_DEVICE_ADDRESS_BITS: 32
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte
CL_DEVICE_GLOBAL_MEM_SIZE: 255 MByte
CL_DEVICE_LOCAL_MEM_TYPE: local
CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
Run Code Online (Sandbox Code Playgroud) 我是GPU编程的新手,我使用brook +语言在ATI流处理器上进行暴力破解RAR密码恢复,但我发现用brook +语言编写的内核不允许任何调用普通函数(内核函数除外),我的问题是:
1)如何在这种情况下使用unrar.dll(到unrar归档文件)API?这是编程RAR密码恢复的唯一方法吗?
2)使用GPU的破解和ElcomSoft软件怎么样?
3)该程序中GPU(ATI Stream处理器或CUDA)内部功能的确切作用是什么?
4)nVidia/CUDA技术比ATI/brook +语言更容易/更灵活吗?
我在C中创建了以下结构"数据"
typedef struct data
{
double *dattr;
int d_id;
int bestCent;
}Data;
Run Code Online (Sandbox Code Playgroud)
'dattr'是上述结构中保持动态的数组.假设我必须创建10个以上结构的对象.即
dataNode = (Data *)malloc (sizeof(Data) * 10);
Run Code Online (Sandbox Code Playgroud)
对于这个结构的每个对象,我必须使用以下命令在C中为数组'dattr'重新分配内存:
for(i=0; i<10; i++)
dataNode[i].dattr = (double *)malloc(sizeof(double) * 3);
Run Code Online (Sandbox Code Playgroud)
如何在OpenCL中实现相同的功能?为结构对象分配内存后,如何为数组'dattr'分配内存?
我有一台具有4个GPU的服务器(Ubuntu 16.04)。我的团队对此表示赞同,并且我们当前的方法是使用Docker容器化我们所有的工作,并使用来将容器限制为GPU $ NV_GPU=0 nvidia-docker run -ti nvidia/cuda nvidia-smi。当我们都非常清楚谁在使用哪个GPU时,这种方法很好用,但是我们的团队已经壮大,我希望有一种更强大的方法来监视GPU的使用,并禁止在使用GPU时对其进行访问。nvidia-smi是“ GPU-Util”的一个信息通道,但有时当容器中的某人当前将其保留时,GPU可能在某一时刻具有0%的GPU-Util。
您对以下方面有什么建议吗?
$ NV_GPU='gpu_id' nvidia-docker run$ NV_GPU='same_gpu_id' nvidia-docker run我可能也在想这错误的方式,因此欢迎其他想法。谢谢!
我正在尝试使用iOS Metal框架和Swift 4 / iOS 11 / XCode 9绘制(并经常更新)折线。对于最终项目,我希望能够用手指“绘制”一条线,以捕获触摸事件。我基本上是在改编本教程《金属教程Swift 3第1部分》中的代码,只是更改了我将在此处描述的部分。尤其是片段和顶点着色器保持不变:
vertex float4 basic_vertex(
const device packed_float3* vertex_array [[ buffer(0) ]],
unsigned int vid [[ vertex_id ]]) {
return float4(vertex_array[vid],1.0);
}
fragment half4 basic_fragment() {
return half4(1.0);
}
Run Code Online (Sandbox Code Playgroud)
基本上,我只是在每个传入的触摸事件上扩展vertexData数组(我将其重命名为stroke):
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let t = touches.first {
let pos = t.location(in: view).applying(transformMatrix)
stroke = []
addStrokePoint(point: pos)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: …Run Code Online (Sandbox Code Playgroud)