因此,我正在使用换位表(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
,因此看来我正在正确地编写代码。
帮助表示赞赏。