CPU 哈希比 GPU 快?

Fin*_*ofs -1 c++ hash opencl

我想生成一个随机数,哈希,与SHA256我的GPU使用OpenCL基本代码(而不是散列那些预先给定的纯文本,它散列随机数)。
我让所有的散列都在我的 GPU 上工作,但有一个问题:
使用 OpenCL 时,每秒完成的散列数量会降低吗?

是的,您没听错,目前仅使用 CPU 比仅使用 GPU 更快。
我的 GPU 仅~10%在我的 CPU 运行时运行~100%

我的问题是:这怎么可能,更重要的是,我该如何解决?

这是我用于生成 a 的代码Pseudo-Random Number(在两次运行之间根本不会改变):

long Miner::Rand() {
    std::mt19937 rng;
    // initialize the random number generator with time-dependent seed
    uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    std::seed_seq ss{ uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed >> 32) };
    rng.seed(ss);
    // initialize a uniform distribution between 0 and 1
    std::uniform_real_distribution<double> unif(0, 1);
    double rnd = unif(rng);
    return floor(99999999 * rnd);
}
Run Code Online (Sandbox Code Playgroud)

这是为我计算哈希率的代码:

void Miner::ticker() {
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    while (true) {
        Sleep(1000);
        HashesPerSecond = hashes;
        hashes = 0;
        PrintInfo();
    }
}
Run Code Online (Sandbox Code Playgroud)

从这里被调用:

void Miner::Start() {
    std::chrono::system_clock::time_point today = std::chrono::system_clock::now();
    startTime = std::chrono::system_clock::to_time_t(today);
    std::thread tickT(&Miner::ticker, this);
    PostHit();
    GetAPIBalance();
    while (true) {
        std::thread t[32]; //max 32
        hashFound = false;
        if (RequestNewBlock()) {
            for (int i = 0; i < numThreads; ++i) {
                t[i] = std::thread(&Miner::JSEMine, this);
            }
            for (auto& th : t)
                if (th.joinable())
                    th.join();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这反过来又被称为这样:

Miner m(threads);
m.Start();
Run Code Online (Sandbox Code Playgroud)

Dra*_*788 7

CPU 具有比 GPU 更好的延迟特性。也就是说,CPU 可以执行一种操作方式,即比 GPU 快 WAAAAYYYY。这甚至没有考虑 CPU -> 主 RAM -> PCIe 总线 -> GDDR5“全局”GPU -> GPU 寄存器 ->“全局 GPU” -> PCIe 总线返回 -> 主 RAM -> CPU 往返时间(和我在这里跳过了几个步骤,比如固定和 L1 缓存)

GPU 具有比 CPU 更好的带宽特性(前提是数据集可以容纳在 GPU 有限的本地内存中)。GPU 执行数十亿次SHA256 哈希的速度比 CPU 执行十亿次SHA256 哈希的速度快。

比特币需要数百万、数十亿甚至数万亿的哈希才能实现具有竞争力的哈希率。此外,计算可以在 GPU 上进行,无需与 CPU 进行太多协作(无需通过 PCIe 进行缓慢的往返)。

这是一个基本设计的问题。CPU 旨在最大限度地减少延迟,但 GPU 旨在最大限度地提高带宽。看起来您的问题是延迟限制(您计算的 SHA256 哈希值太少,GPU 无法生效)。32 是......在我们谈论的范围内真的很小。

在您拥有至少 64 个工作项之前,AMD GCN 架构甚至不会全速运行,并且可以说您确实需要 256 个工作项才能最大化 44 个计算单元中的一个,比如说……一个 R9 290x。

我想我想说的是:用 11264 个(或更多)工作项再试一次,这是 GPU 设计使用的工作项的数量。不是 32。我从 R9 290x 上的 44 个计算单元 * 每个计算单元 4 个向量单元 * 每个向量单元 64 个工作项中得到这个数字。