VBだけによる開発から、C++/CLIとC++のネイティブメソッド間の入出力に処理を移植することで、確実な高速化が実現できています。
VBからC++/CLIへのクラスの移植は、C++/CLIに翻訳したクラス側で、GPUを使った並列処理ネイティブメソッドでの実行に最適化したバイナリーデーターとの相互変換機能を追加しています。この変換機能は、VBやC#単体では記述できないと思います。
個人的な感覚ですが、私も Azulean さん同様、できるだけ .NET でコードを書き、どうしてもC++じゃないとダメなところだけC++を使うというアプローチのほうが良いと思います(処理内容やそこでやり取りするデータによってはP/Invoke(DllImportの利用)でもよいかもしれない)。
質問は可能な限り具体的で簡潔なほうが、回答を得られやすいのは確かですが、そのような場合でも、目的や目標を明示することで別の観点からの回答を得られる場合もあります。
(GPUを使った並列化が目的がわからないので、この先は関係ないかもしれません)
もし並列化の目的が、単なる高速化なのであれば、まずは冗長な処理をなくすところを進めていくほうが現実的だと思います。
VBから C++/CLIによるGPU処理に変えたら速くなったとありますが、それは本当にC++/CLIにしたことによる恩恵なのでしょうか?
もしかしたら、VBで書かれていたコードが冗長な出力を誘発しており、その結果早くなかったものが、C++/CLIにしたことで改善されただけかもしれません。
もしそうであれば、まずはVBでの冗長な処理をなくすことから始めるほうが現実的です。
実際 HashSet<T> での添え字アクセス部分はVBの持つシンタックスシュガーでありこれを使うことであまり高速とは言えないコンパイル結果を出力していることがあります。
もしそうであれば、For でループを回すのではなく ForEach にするだけで十分高速になっており、それ以上はやらなくてもいいかもしれません。
もともと並列処理が可能なデータ管理ができているのであれば、ForEach ではなくParallel.ForEach メソッドを使って並列化することもできます。
もしかしたらこれで十分高速になるかもしれません。
と、ここまで書いていてふと思ったのですが、もしかしていわゆる時間のかかる処理(呼び出してる間画面が更新されず応答なしになる)を何とかするためにいろいろやってきて、GPUを使った並列処理に行きついたなどでしょうか?
もしそうであれば、そもそも応答なしになるという部分を解決してそのうえで、並列処理を用いてさらに高速にするアプローチをとらないと根本的な解決にはなりません。
もしそうなら、変更前の(DoEventsなどを入れる前の)最初の応答なしになってしまうループ部分をメソッドにして Task.Runメソッドを使ってTask.Run( Sub() 作ったメソッド(ぱらめーた) )
とするだけで解決します。
インジケータを動かしたいなどがあるのであれば、作ったメソッドの中からControl.Invoke や Control.BeginIvoke メソッド利用してUIを更新することもできます。
さらなる並列化なら、データフロー(タスク並列ライブラリ)を使うこともできます。
ここまでの部分はいずれもVBだけで出来るものであり、C++/CLI にする必要もありません(もちろんGPUも使わない)。
もし、応答なしはここまでの一連のものとは関係ないということであれば、この辺りは無視してしまってかまいません(そうじゃない旨を一言書いてもらえればその可能性を考えることもなくなるのでありがたいですが)。