在我的代码库中有几个地方,对于大型数据集,相同的操作会重复很多次。在某些情况下,处理这些需要花费相当长的时间。
我相信使用SSE来实现这些循环应该可以显着提高它们的性能,特别是在对同一组数据执行许多操作的情况下,因此一旦数据最初被读入缓存,就不应该有任何缓存未命中而停顿它。不过我不确定是否要去做这件事。
是否有一种独立于编译器和操作系统的方式编写代码来利用 SSE 指令?我喜欢 VC++ 内在函数,其中包括 SSE 操作,但我还没有找到任何交叉编译器解决方案。
我仍然需要支持一些没有 SSE 支持或 SSE 支持有限的 CPU(例如 Intel Celeron)。是否有某种方法可以避免必须制作不同版本的程序,例如使用某种“运行时链接器”,在进程启动时根据运行该代码的 CPU 来链接基本代码或 SSE 优化代码?
那么其他CPU扩展呢,查看各种Intel和AMD CPU的指令集,发现有几个?
对于你的第二点,只要你能将差异分离到不同的函数中,就有几种解决方案:
- 普通的旧 C 函数指针
- 动态链接(通常依赖于 C 函数指针)
- 如果您使用 C++,拥有不同的类来表示对不同体系结构的支持并使用虚拟函数可以对此有很大帮助。
请注意,因为您依赖于间接函数调用,所以抽象不同操作的函数通常需要表示更高级别的功能,否则您可能会失去从调用开销中的优化指令中获得的任何收益(换句话说,不要这样做) t 抽象各个 SSE 操作 - 抽象您正在做的工作)。
这是使用函数指针的示例:
typedef int (*scale_func_ptr)( int scalar, int* pData, int count);
int non_sse_scale( int scalar, int* pData, int count)
{
// do whatever work needs done, without SSE so it'll work on older CPUs
return 0;
}
int sse_scale( int scalar, in pData, int count)
{
// equivalent code, but uses SSE
return 0;
}
// at initialization
scale_func_ptr scale_func = non_sse_scale;
if (useSSE) {
scale_func = sse_scale;
}
// now, when you want to do the work:
scale_func( 12, theData_ptr, 512); // this will call the routine that tailored to SSE
// if the CPU supports it, otherwise calls the non-SSE
// version of the function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)