为什么我的换位表这么慢? (减速4倍)

时间:2018-11-30 21:14:33

标签: artificial-intelligence cython game-engine chess

因此,我正在使用换位表(TT)尝试加快某些棋盘游戏的Alphabet minimax算法的速度。但是令我惊讶的是,当我关闭换位表时,我得到了4倍的加速!换位表应该可以加快速度吗?

所以我注意到的一件事是,只有10%的时间我得到了高速缓存命中。不是最大的,但我不需要75%的TT就能发挥作用。

因此,想法是TT是非常快速的缓存查找。我正在使用2Big替换方案。 TT存储上下限,搜索深度,移动和计算最佳响应所需的工作量(大小)。 LockEntry只是unsigned long long的别名。

我的代码如下:

ctypedef struct CacheEntry:
    LockEntry lock
    minimax_score lower_bound
    minimax_score upper_bound
    int depth
    Move move
    long long size

ctypedef struct BigEntry:
    CacheEntry small
    CacheEntry large  

cdef void set_entry(CacheEntry entry):
    """set an entry into the cache"""
    global cache
    cdef int key
    key = entry.lock % PRIME
    if entry.size > cache[key].large.size or entry.lock == cache[key].large.lock:
        cache[key].large = entry
    else:
        cache[key].small = entry
    return

cdef int get_entry(CacheEntry *entry, LockEntry lock):
    """retrieve an entry from cache"""
    global cache
    global cache_queries
    global large_hits
    global small_hits
    cdef int key
    cache_queries += 1
    key = lock % PRIME
    if cache[key].large.lock == lock:
        large_hits += 1
        entry[0] = cache[key].large
        return 1 #success
    elif cache[key].small.lock == lock:
        small_hits += 1
        entry[0] = cache[key].small
        return 1 #success
    return 0 #failure

set_entry函数采用结构CacheEntry类型并将其放入TT(以下简称为cache)中,而get_entry函数采用指向CacheEntry的指针,并且更新它的值(我尝试返回CacheEntry,但速度没有差异。)。对于成功的缓存命中,它还会返回1,对于失败的缓存,它会返回0

因此,基本上,我对如何正确使用此功能没有想法。我很惊讶它很慢,并且当用-a编译时,它全是white,因此看来我正在正确地编写代码。

帮助表示赞赏。

0 个答案:

没有答案