BDDT: Block-level Dynamic Dependence Analysis for Deterministic Task-Based Parallelism