在详细说明细节之前,我有以下功能,
令 _e, _w 为大小相等的数组。令 _stepSize 为 float 类型。
void GradientDescent::backUpWeights(FLOAT tdError) {
AI::FLOAT multiplier = _stepSize * tdError;
for (UINT i = 0; i < n; i++){
_w[i] += _e[i]*multiplier
}
// Assumed that the tilecode ensure that _w.size() or _e.size() is even.
}
Run Code Online (Sandbox Code Playgroud)
这个函数很好,但是如果一个CPU有内在的,特别是对于这个例子,SSE4,那么下面的函数可以让我减少几秒钟的时间(对于相同的输入),即使-O3 gcc标志已经包含在两个和额外的-msse4a中为此添加了。
void GradientDescent::backUpWeights(FLOAT tdError) {
AI::FLOAT multiplier = _stepSize * tdError;
__m128d multSSE = _mm_set_pd(multiplier, multiplier);
__m128d* eSSE = (__m128d*)_e;
__m128d* wSSE = (__m128d*)_w;
size_t n = getSize()>>1;
for (UINT i = 0; i …Run Code Online (Sandbox Code Playgroud)