1

我正在使用时间差异学习来训练计算机玩围棋。我注意到我的代理在大约 20 分钟内应该能够玩 100.000 场比赛时玩 1 场比赛(比如 10 秒)真的很慢。在缩小问题范围后,我发现该行没有。以下代码中的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 被作为指向函数的指针。

有任何想法吗?

4

2 回答 2

3

如果tmp在你的循环之后没有使用for,你的编译器可能会简单地优化 for循环。

于 2013-04-15T20:00:06.027 回答
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];
}

我使用double了 phiOldWhite 的类型,但你可以使用你的类型。

于 2013-04-15T22:03:39.653 回答