On Optimizing Transactional Memory: Transaction Splitting, Scheduling, Fine-Grained Fallback, And Numa Optimization