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循环的大小,如果循环太多了,失败率就上去了;如果循环次数很小,基本不会出错。

阅读 4.6k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题