哪种方法可以建议加速大规模(CPU)并行程序
What approaches can one recommend for accelerating a massively (CPU) parallel program?
我的Neurovolution程序(C (当前仅限于小型数据集,并且我有(在我当前的工作站/云安排上(需要几个月的时间才能运行。最大的瓶颈不是对网络或进化过程的评估。它是数据集的大小。为了获得候选网络的适应性,必须对集合中的每个记录进行评估。
在一个完美的世界中,我将可以访问一个基于云的虚拟机实例,其中15,120记录封面类型数据集中的每个记录有1个核心。但是,我发现的最大的VM是112核。目前,我的程序使用OpenMP并行化实施所有记录评估的循环。加速度等于内核数。交叉/突变是串行的,但很容易平行于对每个人的评估(其中100-10,000个(。
最大的问题是网络必须实现的方式。直接从此结构中解决网络。
struct DNA {
vector<int> sizes;
vector<Function> types;
vector<vector<double>> biases;
vector<vector<vector<double>>> weights;
};
GPU加速度似乎是不可能的。程序的结构必须由可以不同的多维数据类型的大小(并非每个层都是相同的大小(制成的。我选择了STL向量...然后意识到无法传递内核或解决这些核。标准操作(向量/矩阵(需要数据转换,传输,运行和转换。它根本不可行。
mpi。我最近对此进行了限制,它似乎是为了评估每个人的适应性而可行的。如果评估每个人需要更多的时间比几秒钟(这是一个近乎确定性(,我可以想象这种方法是最好的前进方法。但是,我正在考虑如何进行proced的3种可能性:
- 初始化"主"云实例,并使用它来启动100-10,000个较小的实例。每个人都会在内存中具有数据集的副本,并且一旦找到解决方案,就需要删除。
- SBCS,其成本较低和规格的增加可以允许建造一个小型家庭计算集群,消除了对云的任何安全问题,并使我对硬件有更多控制权。
- 我不知道自己在做什么,如果没有GPU加速,就不可能繁殖更大的神经网络,我无法理解"推力"库可以允许基于矢量的代码在GPU上运行,而且我还没有完成作业。
通过查看您所描述的内容,我认为GPU加速度不是不可能的。我最喜欢的方法是OpenCL,但是即使您使用CUDA,也无法轻松地将C STL用于此目的。但是,如果您经历了将C 代码转换为C数据结构的障碍(即float
,double
或int
以及它们的数组,而不是vector<>
类型,然后将vector<Function>
重新定义为更原始的类型(,则应利用GPU为简单,特别是如果您的程序主要是矩阵操作。但是您可能需要提防GPU架构与CPU不同。如果您的逻辑有很多分支(即IF-then-else结构(,则GPU的性能不好。
gpu比您想象的要强大得多。GPU中的所有内存都是动态分配的,这意味着您可以根据需要分配任意数量的内存。如果要为每个线程指定不同的大小,只需将它们存储在数组中,然后使用线程ID进行索引即可。此外,您甚至可以将网络存储在共享内存中,并通过线程评估记录以加速内存访问。如您提到的,最方便的方法是使用推力库。如果您的目标不研究GPU,则不需要了解如何实施。您都不需要担心性能问题,因为它是由专业的GPU专家(许多来自构建GPU的NVIDIA(优化的。推力的设计与STL非常相似,因此,如果您熟悉C ,则很容易掌握。
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 分别测量每个线程上花费的 CPU 时间(C++)
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 您选择的 CPU 不支持 x86-64 指令集
- 如何降低应用程序的 CPU 使用率?
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 如何区分CPU和内存瓶颈?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- CPU 如何提供memory_order_acquire保证?
- 一段时间后 CPU 使用率高
- C/C++memcpu基准测试:测量CPU和墙时间
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 哪种方法可以建议加速大规模(CPU)并行程序