【发布时间】:2011-03-13 20:41:58
【问题描述】:
是否有一个函数(SSEx 内部函数可以)用指定的int32_t 值填充内存?例如,当此值等于 0xAABBCC00 时,结果内存应如下所示:
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
...
我可以使用std::fill 或简单的 for 循环,但速度不够快。
在程序开始时只执行一次向量的大小调整,这不是问题。瓶颈正在填满内存。
简化代码:
struct X
{
typedef std::vector<int32_t> int_vec_t;
int_vec_t buffer;
X() : buffer( 5000000 ) { /* some more action */ }
~X() { /* some code here */ }
// the following function is called 25 times per second
const int_vec_t& process( int32_t background, const SOME_DATA& data );
};
const X::int_vec_t& X::process( int32_t background, const SOME_DATA& data )
{
// the following one string takes 30% of total time of #process function
std::fill( buffer.begin(), buffer.end(), background );
// some processing
// ...
return buffer;
}
【问题讨论】:
-
你为什么不用 SSE 指令自己编码呢?您有 movxxxx 指令来移动内存(一次 128 位)。只是一个循环和动作,应该不难做到。
-
我承认我有点好奇你的用例可能是什么导致 for 循环不够快。你只是在处理一个巨大的内存块吗?您的平台是否擅长分支?您是否经常在高性能应用(如游戏或其他应用)中执行此操作?
-
@Alexandre C.,SSE 指令没问题,但我认为 WinAPI 中可能已经有一些功能。我不想发明轮子。
-
您能否发布代码以便我们准确了解您在做什么?这可能有助于我们弄清楚为什么它很慢。另外,我们所说的向量有多大?几百?几十万?
-
@Sean Edwards,我已经添加了代码。
标签: c++ windows winapi visual-c++ memory