You can actually go the other route too.  There&#x27;s a library called Thrust that provides a STL-like interface to CUDA, as well as &quot;glue&quot; functions that go between the finely-tuned stuff.<p>One of the things Thrust supports is an OpenMP backend, so it can emit code that runs on a CPU instead of a GPU.  I&#x27;ve never tried it so I don&#x27;t know how good it is, particularly on the collective operations.  But I assume if what you want is a &quot;#pragma omp parallel for 1-to-N&quot; then it&#x27;s probably great.  Construct your operation as a functor and use a thrust::for_each from 1 to N.