假设我有一个包含100000行的表和一个python脚本,它按顺序对该表的每一行执行一些操作。现在要加快这个过程,我应该创建10个单独的脚本并同时运行它们来处理表的后续10000行,还是应该创建10个线程来处理行以获得更好的执行速度?
进程线程共同有一个连续的(虚拟)内存块,称为堆进程。相对于整个进程(单独的脚本),线程也消耗更少的OS资源,并且不会发生上下文切换。
当没有涉及锁定/障碍时,多线程执行中的单个最大性能因素是数据访问局部性,例如。矩阵乘法核。
假设数据以线性方式存储在堆中,即。 [0-4095]字节中的第0行,[4096-8191]字节中的第1行等。然后,线程0应该在0,10,20,......行中运行,线程-1在1,11中运行,21,...行等
主要思想是将一组4K页保存在物理RAM中,将64字节块保存在L3缓存中并重复操作。计算机通常假设如果你“使用”特定的内存位置,那么你也会使用相邻的内存位置,你应该尽力在你的程序中这样做。最糟糕的情况是以随机方式访问大约10MiB的内存位置,所以不要这样做。例如。如果单行的大小为1310720双精度(64B),则您的线程应以行内(单行)而非行间(上)方式运行。
根据您的结果对您的代码进行基准测试,如果您的算法可以处理大约21.3GiB / s(DDR3-2666Mhz)的行,那么您将拥有一个内存限制任务。如果您的代码类似于1GiB / s处理速度,那么您有一个计算限制任务意味着执行数据指令比从RAM获取数据需要更多时间,您需要通过利用AVXx指令集优化代码或达到更高的IPC。购买更新核心或更高频率的新处理器。