NoMap Speeding-Up JavaScript Using Hardware Transactional Memory

NoMap: Speeding-Up JavaScript Using Hardware Transactional Memory

  1. 摘要:

    • 背景:
      • 脚本语言的性能较差是由于编译器缺少足够的静态信息。为了解决这个问题,JIT编译器被组织成多个级别,更高的级别使用剖视信息来生成高性能的代码。
      • 为了检测不正确的假设,会插入一些检查,如果检查出错,执行会过渡到更低的级别。
      • 在层级之间潜在的转移点成为 栈映射点(stack map point)。SMP在两个层级之间需要一个一致的状态,导致较高层中SMP之间的代码优化会受到限制
    • 问题:论文通过检查最新的javascript编译器生成的代码,发现该代码具有很高的SMP频率(SMP出现的很多),但是很少会引起过渡到底层级执行的发生,但是SMP会限制优化,同时带来由于SMP防护检查而导致的性能损失
    • 论文工作:
      • 扩展了编译器以围绕SMP生成硬件事务,并执行由事务启用的简单的事务内优化(within-transaction optimizations)
      • 论文工作的目标是新兴的轻型HTM系统,论文的工作被成为NoMap
      • 结果:在基准测试SunSpider和Kraken上,NoMap的指令数更少,执行时间也更少
  2. 介绍:

    • 许多脚本语言实现中都添加了例如内联缓存(inlining caching),类型专门化(type specialization)和JIT(just-in-time)支持等计数,使得脚本语言的性能逐渐被不同领域所接受。但是性能相对于类似于C语言的语言,仍旧很低(图中的Python, PHT,Ruby的JIT实现比其参考解释器实现的快了5.7,2.3,1.9倍)
      在这里插入图片描述

    • 脚本语言滞后的主要原因是它们的动态特性(dynamic nature),程序员不需要声明类型,编译去需要在运行时发现对象的类型和结构,从

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
static INT16S SWGetVolt(INT8U *pSWData, INT16U offset, INT8U *pMBData, INT8U bUseOffset, INT8U bGet8Bit, INT8U bGetMap, enum VoltType voltType) { INT8U bMBMap8Bit = (g_headVoltageData.flag == EPR_HEAD_VOLTAGE_FLAG) ? 1 : 0; INT8U bMBMap16Bit = 0; //该变量只是用于使逻辑更清晰,实际无16bit map INT32U voltPerHead = HbdAttrib.MapPerHead * HbdAttrib.VoltPerMap; INT16U setLen = SWSetVoltCount; INT32U voltCnt = voltPerHead * g_nHeadBoardNum * HbdAttrib.HeadCount; INT8U bMBNoMap16Bit = (g_headVoltageData.flag == EPR_HEAD_VOLT_16BIT_NOMAP_FLAG) ? 1 : 0; INT8U bMBNoMap8Bit = (g_headVoltageData.flag == EPR_HEAD_VOLT_8BIT_NOMAP_FLAG) ? 1 : 0; INT8U bGet16Bit = bGet8Bit ? 0 : 1; TRACE_APPDBG("%s flag:%04x bGetMap:%d bGet8:%d bMBMap8Bit:%d bMBNoMap8Bit:%d bMBNoMap16Bit:%d\r\n", __func__, g_headVoltageData.flag, bGetMap, bGet8Bit, bMBMap8Bit, bMBNoMap8Bit, bMBNoMap16Bit); for (INT32U hbdIdx = 0; hbdIdx < g_nHeadBoardNum; hbdIdx++) { for (INT32U i = 0; i < HbdAttrib.HeadCount; i++) { INT8S srcIndex = 0, destIndex = 0; if ((bGetMap && (bMBMap16Bit || bMBMap8Bit)) || ((!bGetMap) && (bMBNoMap16Bit || bMBNoMap8Bit))) { srcIndex = HbdAttrib.HeadCount * (hbdIdx) + i; destIndex = srcIndex; } else if (bGetMap && (bMBNoMap16Bit || bMBNoMap8Bit)) { srcIndex = HbdAttrib.HeadCount * (hbdIdx) + i; destIndex = vol_MapHeadNumber(hbdIdx * HbdAttrib.HeadCount * (voltPerHead) + i, DO_MAP_TEMPERATURE); } else if ((!bGetMap) && (bMBMap16Bit || bMBMap8Bit)) { destIndex = HbdAttrib.HeadCount * (hbdIdx) + i; srcIndex = vol_MapHeadNumber(hbdIdx * HbdAttrib.HeadCount * (voltPerHead) + i, DO_MAP_TEMPERATURE); } for (INT32U j = 0; j < voltPerHead; j++) { if (bGet16Bit && (bMBMap8Bit || bMBNoMap8Bit)) { INT16U vol16bit = VOL8To16(pMBData[srcIndex * voltPerHead + j], voltType); ((INT16S*)pSWData)[(destIndex * voltPerHead + j)] = vol16bit; } else if (bGet8Bit && (bMBMap16Bit || bMBNoMap16Bit)) { INT8U vol8bit = VOL16To8(((INT16S*)pMBData)[(srcIndex * voltPerHead + j)], voltType); pSWData[destIndex * voltPerHead + j] = vol8bit; } else if (bGet8Bit) pSWData[destIndex * voltPerHead + j] = pMBData[srcIndex * voltPerHead + j]; else if (bGet16Bit) ((INT16S*)pSWData)[(destIndex * voltPerHead + j)] = ((INT16S*)pMBData)[(srcIndex * voltPerHead + j)]; } } } if (bUseOffset && offset) memcpy((void *)pSWData, (void *)&pSWData[offset], setLen); //适应老的拆包发送 INT16U dataLen = (bGet8Bit && bGetMap) ? SWSetVoltCount : voltCnt * (bGet8Bit ? sizeof(INT8U) : sizeof(INT16U)); return dataLen; }
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值