1. A method comprising, by one or more computer systems: accessing bytecode generated by a compiler from a software program for execution by a particular processing unit that supports single-instruction-multiple-data (SIMD) execution; accessing configuration information describing one or more aspects of the particular processing unit; symbolically executing the bytecode with the configuration information, the symbolic execution comprising: assigning symbolic inputs to input variables of the software program; determining one or more execution paths in the software program; for each of the execution paths, constructing a symbolic expression that, if satisfied, causes the software program to proceed down the execution path, one or more of the symbolic expressions being based at least in part on the configuration information; and using the symbolic expressions, executing multiple threads in the bytecode according to a deterministic thread schedule, the deterministic thread schedule simulating SIMD execution; based on the symbolic execution: generating one or more results conveying a functional correctness of the software program with respect to the particular processing unit for communication to a user, each of the one or more results indicating a feasible execution path of the software program with respect to the symbolic input; and generating one or more test cases for the software program for communication to a user, each of the one or more test cases indicating values that satisfy a result of the one or more results.