Enhancing Gpu Programmability And Correctness Through Transactional Execution