哪种方法可以建议加速大规模(CPU)并行程序

What approaches can one recommend for accelerating a massively (CPU) parallel program?

本文关键字:大规模 CPU 程序 并行 加速 方法      更新时间:2023-10-16

我的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种可能性:

  1. 初始化"主"云实例,并使用它来启动100-10,000个较小的实例。每个人都会在内存中具有数据集的副本,并且一旦找到解决方案,就需要删除。
  2. SBCS,其成本较低和规格的增加可以允许建造一个小型家庭计算集群,消除了对云的任何安全问题,并使我对硬件有更多控制权。
  3. 我不知道自己在做什么,如果没有GPU加速,就不可能繁殖更大的神经网络,我无法理解"推力"库可以允许基于矢量的代码在GPU上运行,而且我还没有完成作业。

通过查看您所描述的内容,我认为GPU加速度不是不可能的。我最喜欢的方法是OpenCL,但是即使您使用CUDA,也无法轻松地将C STL用于此目的。但是,如果您经历了将C 代码转换为C数据结构的障碍(即floatdoubleint以及它们的数组,而不是vector<>类型,然后将vector<Function>重新定义为更原始的类型(,则应利用GPU为简单,特别是如果您的程序主要是矩阵操作。但是您可能需要提防GPU架构与CPU不同。如果您的逻辑有很多分支(即IF-then-else结构(,则GPU的性能不好。

gpu比您想象的要强大得多。GPU中的所有内存都是动态分配的,这意味着您可以根据需要分配任意数量的内存。如果要为每个线程指定不同的大小,只需将它们存储在数组中,然后使用线程ID进行索引即可。此外,您甚至可以将网络存储在共享内存中,并通过线程评估记录以加速内存访问。如您提到的,最方便的方法是使用推力库。如果您的目标不研究GPU,则不需要了解如何实施。您都不需要担心性能问题,因为它是由专业的GPU专家(许多来自构建GPU的NVIDIA(优化的。推力的设计与STL非常相似,因此,如果您熟悉C ,则很容易掌握。