There is considerable ongoing work aimed at solving this problem for functional languages. It is worth pointing out that there has been one notable success in parallel functional programming. Some parallel languages try to make the problems of detecting parallelism, distributing data, and choosing granularity easier by making these operations more explicit in the program. To date, dataparallel programming has been the most successful, and most of its ideas have been adopted in recent versions of Fortran. The basic idea is easy to explain.
Lists are a standard datatype in functional languages.
It is easy to see that map is a natural parallel operation. In addition, fold is amenable to parallel evaluation using a computation tree of depth log n for a list of length n, provided the function being folded is associative and has a unit. Effectively, the decision about what to do in parallel is put on the programmer, with the type system making the distinction explicit. Before continuing, it is worth pointing out that map and fold, and their collection counterparts, are quite expressive and sufficient for specifying many useful parallel computations.