我是 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 总线上传输数据是 slooooooooowwwwwwwwwwwww
- 访问 GPU 上的全局内存是 sloooooooooooooowwwwww
- 经线中的所有“线程”必须执行相同的指令
这让我质疑在这种情况下 GPU 计算的有效性,因为在我看来,我需要使用以下方法之一:
- 让每个线程计算自己的排列(违反#3,因为每个线程将有不同数量的增量要做)
- 让每个线程执行一个影响所有其他线程的增量(违反 #2)
- 计算 CPU 上的排列并将它们分派给 GPU(违反 #1,另外我基本上只是使用 GPU 来计算哈希......)
这些结论准确吗?如果不是,为什么,还有什么需要注意的吗?