我在学习使用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循环的大小,如果循环太多了,失败率就上去了;如果循环次数很小,基本不会出错。
这问题我也遇到了,https://stackoverflow.com/que...这里有个答案,但是答案没有很好地说明问题的缘由,你搞清楚了吗?