私は、OpenCL とハッシュの長所と短所を見つけようとしている OpenCL のまったくの初心者です。
たとえば、自明なハッシュ関数があるとします。
public static uint GetHash(string str)
{
uint s = 21; // seed
foreach (char ch in str)
s = (s + (uint)ch) * 10;
return s;
}
(これが恐ろしいハッシュであることはわかっていますが、これは単なる例です)
a-zA-Z0-9_
ここで、文字のすべての順列を 50 の長さまで計算したいとします。たとえば、次のようになります。
a
b
...
_
aa
ab
...
__
明らかに、これは膨大な数 (63^50) のハッシュを計算する必要があるため、OpenCL と GPU コンピューティングを使用することにしました。
私の質問は、OpenCL/GPU コンピューティングがもたらす落とし穴はありますか? 私は以下を読みました:
- PCIe バス経由でデータを転送するのは遅いです。
- GPU 上のグローバル メモリへのアクセスは sloooooooooooowwwwww
- ワープ内のすべての「スレッド」は同じ命令を実行する必要があります
これにより、この場合の GPU コンピューティングの有効性に疑問が生じます。次のアプローチのいずれかを使用する必要があるように思われるからです。
- 各スレッドに独自の順列を計算させます (各スレッドで実行するインクリメントの数が異なるため、#3 に違反します)。
- 各スレッドに、他のすべてのスレッドに影響する 1 つのインクリメントを実行させる (違反 #2)
- CPUで順列を計算し、それらをGPUにディスパッチします(#1に違反します。さらに、基本的にGPUを使用してハッシュを計算しています...)
それらの結論は正確ですか?そうでない場合、その理由と、他に注意すべきことはありますか?