我在学习使用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循环的大小,如果循环太多了,失败率就上去了;如果循环次数很小,基本不会出错。
认证高级PHP讲师