Intel 的hardware transactional memory接口 _xbegin() 返回结果为0

发布于 2022-09-03 00:56:21 字数 1801 浏览 12 评论 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

骷髅 2022-09-10 00:56:21

这问题我也遇到了,https://stackoverflow.com/que...这里有个答案,但是答案没有很好地说明问题的缘由,你搞清楚了吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文