在DLL中使用cpu特定功能有哪些标准技术?

时间:2008-09-25 02:13:00

标签: windows optimization dll

简短版本:我想知道是否有可能,以及如何最好地利用CPU特定 DLL中的指令?

版本略长: 从Microsoft下载(32位)DLL时,似乎只有一种尺寸适合所有处理器。

这是否意味着它们是为最低公分母(即 操作系统支持的最低平台)? 或者是否有一些技术用于导出DLL中的单个接口但使用 幕后CPU特定代码可以获得最佳性能?如果是这样,它是如何完成的?

5 个答案:

答案 0 :(得分:6)

我不知道任何标准技术,但如果我必须做这样的事情,我会在DllMain()函数中编写一些代码来检测CPU类型并填充跳转表使用函数指针指向每个函数的CPU优化版本。

当CPU类型未知时,还需要最小公分母函数。

您可以在注册表中找到当前的CPU信息:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor

答案 1 :(得分:2)

预计DLL可以在WIN32运行的每台计算机上运行,​​因此您一般都会遇到i386指令集。没有公开的方法来公开特定指令集的功能/代码。你必须手工透明地做到这一点。

使用的技术基本如下:   - 在运行时确定MMX,SSE等CPU功能   - 如果它们存在,使用它们,如果没有,则准备好后备代码

因为你不能让你的编译器优化i386以外的任何东西,你必须使用内联汇编程序中的特定指令集编写代码。我不知道是否有更高语言的工具包。确定CPU功能很简单,但也可能需要在汇编程序中完成。

答案 2 :(得分:1)

获得SSE / SSE2优化的简单方法是仅使用MSVC的/arch参数。我不担心后备 - 除非你有一个非常小众的申请,否则没有理由支持以下任何东西。

http://msdn.microsoft.com/en-us/library/7t5yh4fd.aspx

我相信gcc / g ++有相同的标志。

答案 3 :(得分:1)

从Microsoft下载的DLL是针对通用x86架构的,其原因很简单,因为它必须适用于所有众多计算机。

直到Visual Studio 6.0时间框架(我不知道它是否已经更改)Microsoft过去常常针对大小而不是速度来优化其DLL。这是因为DLL的整体大小的减少比编译器可以生成的任何其他优化提供了更高的性能提升。这是因为与没有CPU等待存储器的加速相比,来自微优化的加速将明显较低。速度的真正改进来自减少I / O或改进基本算法。

只有少数几个运行在程序核心的关键循环才能从微优化中受益,因为它们被调用的次数很多。只有大约5-10%的代码可能属于此类别。您可以放心,这些关键循环已经由Microsoft软件工程师在汇编程序中进行了优化,并且不会让编译器找不到。 (我知道它期待太多但我希望他们这样做)

正如您所看到的,增加的DLL代码只会有一些缺点,包括为不同的体系结构调整的代码的其他版本,因为大多数代码很少使用/永远不会占用大部分代码的关键代码你的CPU周期。

答案 4 :(得分:1)

对于不同的架构,英特尔的ICC可以编译两次代码。这样,你就可以吃蛋糕了。 (好吧,你得到两个蛋糕 - 你的DLL会更大)。甚至MSVC2005也可以针对非常特殊的情况(例如memcpy()可以使用SSE4)

有许多方法可以在不同版本之间切换。加载DLL,因为加载过程需要它的功能。函数名称转换为地址。一种解决方案是让这种查找不仅取决于函数名称,还取决于处理器功能。另一种方法使用名称地址函数在临时步骤中使用指针表的事实;你可以切换整个表。或者你甚至可以在关键功能中有一个分支;所以当foo更快时,foo()调用foo__sse4。

相关问题