Intel 的hardware transactional memory接口 _xbegin() 返回结果为0
我在学习使用intel 的Transactional Synchronization Extensions即硬件事务内存。
新的gcc版本应该直接支持:gcc htm
里面的函数_xbegin()如果出错应该有一个返回码。但是我现在发现有很大的概率直接返回0.也就是说没有任何错误码出现。
下面贴上我的测试代码,模拟银行转账:
void* f1(bank_t* bank, int id){
for(int i=0; i<5000000; i++){
int src = rand()%bank->size;
int dst = rand()%bank->size;
//printf("src %d dst %d\n", src, dst);
while(src == dst){
dst = rand()%bank->size;
}
unsigned stat = _xbegin();
if(stat == _XBEGIN_STARTED){
bank->accounts[src].balance--;
bank->accounts[dst].balance++;
_xend();
tx[id]++;
}else{
_abort[id]++;
if (stat & _XABORT_CONFLICT){
conflict[id]++;
}
if (stat & _XABORT_CAPACITY){
capacity[id]++;
}
if (stat & _XABORT_DEBUG){
debug[id]++;
}
if (stat & _XABORT_RETRY == 0){
failed[id]++;
}
if (stat & _XABORT_NESTED){
printf("[ PANIC ] _XABORT_NESTED\n");
exit(-1);
}
if (stat & _XABORT_EXPLICIT){
printf("[ panic ] _XBEGIN_EXPLICIT\n");
exit(-1);
}
if (stat == 0){
// printf("[ panic] stat is zero\n");
// exit(-1);
}
}
}
return NULL;
}
因为经常返回0,也就是transaction失败了,所以性能会很差。我想知道有没有人遇到类似的问题。
PS:还有一个奇怪的现象就是失败的概率取决于上面的loop循环的大小,如果循环太多了,失败率就上去了;如果循环次数很小,基本不会出错。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这问题我也遇到了,https://stackoverflow.com/que...这里有个答案,但是答案没有很好地说明问题的缘由,你搞清楚了吗?