linux - Intel 的hardware transactional memory接口 _xbegin() 返回结果为0
PHP中文网
PHP中文网 2017-04-17 15:20:20
0
0
508

我在学习使用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中文网
PHP中文网

认证高级PHP讲师

모든 응답 (0)
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!