我正在使用时差学习来训练计算机。我注意到我的经纪人玩1场比赛(比如10秒)的速度非常慢,应该可以在大约20分钟内打出100.000场比赛。在缩小问题的范围之后,我发现了这一行。以下代码中的5是麻烦制造者。代码取自更大的函数。
int i;
double td = newValue - oldValueWhite;
for(i = 0; i<FEATURES_SIZE; i++)
{
Value[i] =Value[i] + alpha*(td)*((double)phiOldWhite[i]);
}
但是,以下代码运行顺利:
double tmp:
int i;
double td = newValue - oldValueWhite;
for(i = 0; i<FEATURES_SIZE; i++)
{
tmp =Value[i] + alpha*(td)*((double)phiOldWhite[i]);
}
我不确定编译器是否只是忽略了计算,或者是否为Value [i]分配新值非常慢。值得一提的是,Value被作为指向函数的指针。
有什么想法吗?
答案 0 :(得分:3)
如果在tmp
循环后未使用for
,则编译器可能只是优化for
循环。
答案 1 :(得分:0)
如果您使用的是C99,可以尝试以下方法(或使用gcc扩展程序__restrict__
):
int i;
double restrict *Value = ...; // tell compiler Value and phiOldWhite are
double restrict *phiOldWhite = ...; // different memory areas
double td = (newValue - oldValueWhite) * td;
for (i = 0; i < FEATURES_SIZE; i++)
{
Value[i] += td * phiOldWhite[i];
}
我为phiOldWhite使用了double
类型,但你可以使用你的类型。