【发布时间】:2013-05-22 08:00:15
【问题描述】:
我目前正在用 C# 编写一个应用程序,它可以从使用 SSE 中受益匪浅,因为相对较小的一段代码会占用 90-95% 的执行时间。代码本身也非常适合 SSE(因为它是基于矩阵和向量的),所以我继续使用 Mono.Simd,尽管这在执行时间上产生了显着差异,但这仍然不够。 Mono.Simd 的问题在于它只有非常旧的 SSE 指令(我相信主要来自 SSE1 和 SSE2),这会导致点积(或标量/内积)例如占用 3 条指令,而它可以是仅在 1 条指令中使用 SSE4 实现(并且由于 SSE4 自 2006 年以来可用,因此可以安全地假设现在每台现代计算机都拥有它)。此外,根本不包括一堆其他函数(例如,获取每个数字的绝对值,这也需要一个笨拙的解决方法)。
我的问题是,我可以从我的 C# 代码中调用任何其他库来使用 SSE/SIMD 吗?也可以在 C# 中使用内联汇编,所以显然我也可以使用 C++ 代码,尽管这会导致性能下降,但如果有人有一个相对易于使用的 C++ 库和上述函数,这将是可以接受的我猜。
提前感谢您的帮助。
【问题讨论】:
-
在 C++/CLI 中创建一个类库。您可以在使用 #pragma unmanaged 编译的代码中使用 SSEx 内在函数。但是,您将永远无法高效地执行一条 SSE4 指令,从托管代码执行切换到非托管代码执行会产生开销。大约需要 5 纳秒,加上编组参数所涉及的任何开销以及使变量与 16 对齐所需的不可避免的副本。您的本机代码必须足够大以摊销该成本。
-
“自 2006 年以来 SSE4 可用,因此可以放心地假设现在每台现代计算机都有它”- Penryn(英特尔)是 2008 年 1 月,推土机(AMD)是 2011 年 10 月。如果你不对 SSE2 进行后备时,您的代码将分别在早于 Intel 和 AMD 的这些日期的任何 CPU 上崩溃。
-
你可以使用 opencl 包装器。