Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 基于SIMD算法实现的复杂性比较_Algorithm_Simd - Fatal编程技术网

Algorithm 基于SIMD算法实现的复杂性比较

Algorithm 基于SIMD算法实现的复杂性比较,algorithm,simd,Algorithm,Simd,我只是想知道,测量由两种不同的SIMD(如SSE3和CUDA)实现的算法复杂性的方法是什么。通常我们将算法复杂度与Big-O表示法进行比较。有没有这样的方法将运行时改进与SIMD进行比较 如果有人问如果你在GPU上运行一个算法会改进多少。你能从理论上衡量它吗?没有在CPU和GPU上运行基准测试 注:我理解什么是大O。因此,我只想知道SSE3与CUDA或基于CPU的实现相比,在没有原始基准点的情况下,同一算法的执行情况如何。在大多数情况下,Big-O表示法不适用于CPU指令 指令属于低级硬件的领域

我只是想知道,测量由两种不同的SIMD(如SSE3和CUDA)实现的算法复杂性的方法是什么。通常我们将算法复杂度与Big-O表示法进行比较。有没有这样的方法将运行时改进与SIMD进行比较

如果有人问如果你在GPU上运行一个算法会改进多少。你能从理论上衡量它吗?没有在CPU和GPU上运行基准测试


注:我理解什么是大O。因此,我只想知道SSE3与CUDA或基于CPU的实现相比,在没有原始基准点的情况下,同一算法的执行情况如何。在大多数情况下,Big-O表示法不适用于CPU指令

指令属于低级硬件的领域,是计算机不纯的肉体。计算机科学并不关心这些粗糙的概念

(事实上,“计算机科学”一词用词不当。有一句广为流传的名言,“计算机科学与计算机的关系并不比天文学与望远镜的关系更密切。”这句话被错误地归因于埃德斯格·迪克斯特拉,但实际上它源于迈克尔·费罗斯。请在这里阅读:)

在任何情况下,如果您坚持认为算法是由CPU指令执行的,并且如果您还坚持对指令的运行时复杂性进行推理,那么您必须考虑内存访问

您需要首先提出一些在SSE3和CUDA之间具有可比性的“工作单元”,然后您需要设置一些机制,以便可以进行测量

  • SSE3的内存访问次数如何随着工作量的增加而增加,以及

  • CUDA的内存访问数相对于相同的工作量是如何增加的


这将很难实现,我的猜测是,结果将是非常线性的,这意味着无论哪一个需要更多或更少的内存访问,在这两种情况下,访问的数量都会随着要做的工作量而线性变化。

使用SIMD/SSE3不会改变大O复杂性,因为它执行常量(最多16个)操作

 O(Function(N)/Const) === O(Function(N))

CUDA也是如此,尽管有上千个内核在工作(如果我们忽略不同的内存访问模型,CUDA实现不使用另一种算法)

Big-O通常会谈到一个算法如何随着所考虑的项目数N的增长而扩展

因此,对于一个O(N)算法,如果你有10倍的数据,你期望大约10倍的运行时间。如果你有一个O(n)日志₂ n) 算法,10倍的数据可以让你多做33倍的工作

粗略地说,CUDA和GPU跨p核并行操作。所完成的总功由
W=pt
给出,其中p是堆芯数,
t
是每个堆芯操作的时间复杂度。例如,您可以使用√N个处理器每个都在做O(√工作。该算法的总时间复杂度仍然是O(N logn),但该算法被认为是“工作效率”,因为其总时间复杂度与最著名的串行算法相同(或小于)。因此,Big-O分析可以告诉您一些关于算法如何在并行环境中运行的信息

但是,它不是您要寻找的工具。Big-O是用来谈论算法如何扩展的:它不能告诉我们一个算法在不同的硬件上如何执行

对于性能的理论方法,您需要研究和,它提供了简单的指标,表明当项目的资源增加时,我们可以期望项目有多大的改进。它们都归结为承认速度的总体增长是我们可以加速的程序部分和我们可以加速的数量的函数

你能做得更好吗?对您可以使用更复杂的模型来确定代码在不同环境中的性能,研究()可能会让您开始

除此之外,你的问题太具体了,无法在这里很好地回答。运行基准测试可能是您个人的最佳选择。

一些答案(可能还有您的问题)反映了对Big-O的基本误解。
O(f(n))
只是对数学函数的分类。它与运行时或其他任何东西没有任何先验关系。这很清楚

当然,有了正确的数学机制,你所要求的肯定是可能的

要在算法上下文中使用big-O,必须首先描述要分类的函数。一个经典的例子是排序算法。这里经常使用的一个函数是对给定长度的列表进行排序所需的比较次数
f(n)
。当我们(相当不精确地)说排序算法是
O(n log n)
时,我们通常是说当
n
足够大时,排序所需的比较数被
K n log(n)
限制,其中
K
是某个正常数

您也可以在运行时上下文中使用big-O,但还必须规定一个正式的机器模型。这是对真实机器的精确数学抽象。其中有很多。对于许多不涉及并行处理的目的,使用or,但还有其他选项

当我们说“一个算法是
O(g(n))
”时,我们真正的意思是,在大多数情况下,“在
n
大小的输入上运行该算法所需的字RAM时钟周期数被
K g(n)
限制为某个常数
K
,因为
n
足够大

也就是说,有了一个抽象机器模型,按big-O分类的函数就是作为输入大小函数的抽象机器的时钟周期数

对于SIMD计算,是一种常用的抽象机器