Secondo me dovresti affrontare il problema da un altro punto di vista: ho un compito che richiede in totale, che so, ad esempio 1 miliardo di operazioni. Tu puoi dividere questo task in un numero arbitrario di thread, però dovresti considerare il numero di core/cpu disponibili e, in generale, il fatto che ogni core/cpu non sarà dedicata solamente ai tuoi thread e, quindi, dovrà eseguire altri processi con i relativi threads. Per questo se usi molti thread c'è un'alta probabilità che, in un dato momento, uno di essi sia in esecuzione, ma frammenti troppo il programma e ci perdi in context switch e quant'altro.
Al contrario se usi un solo thread non sfrutti il parallelismo.
Per questo il numero ideale sarebbe uguale al numero di core (ovvero per sfruttare appieno il parallelismo). Dato, però, che i core non sono dedicati esclusivamente ai tuoi calcoli ma eseguono anche altri processi, allora utilizzando un ulteriore thread si aumenta la probabilità che uno di essi sia in esecuzione, senza degradare le performance (anzi, da test eseguiti in laboratorio nella nostra università erano emersi lievi miglioramenti).
In ogni caso la questione della computazione parallela non è così semplice, perché bisognerebbe considerare, ad esempio, le operazioni di I/O e, in generale, si tratta di una questione application-specific.