CPU散列比GPU快?

时间:2017-10-02 17:45:21

标签: c++ hash opencl

我想生成一个随机数,并使用带有this基本代码的SHA256在我的GPU上使用OpenCL进行哈希处理(而不是哈希那些预先给定的纯文本,它哈希随机数) 我得到了所有的哈希工作在我的GPU上,但有一个问题:
使用OpenCL时,每秒的哈希量是否会降低?

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

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

这是我用于生成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);
}

以下是为我计算哈希值的代码:

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

从这里调用:

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();
        }
    }
}

反过来这样被称为:

Miner m(threads);
m.Start();

1 个答案:

答案 0 :(得分:4)

CPU具有比GPU更好的延迟特性。也就是说,CPU可以采用一种操作方式,比GPU可以快得多WAAAAYYYY。这甚至没有考虑到CPU - &gt;主RAM - &gt; PCIe总线 - &gt; GDDR5“全球”GPU - &gt; GPU寄存器 - &gt; “全球GPU” - &gt; PCIe总线返回 - &gt;主RAM - &gt; CPU往返时间(我在这里跳过几步,比如固定和L1缓存)

GPU具有比CPU更好的带宽特性(假设数据集可以适合GPU有限的本地内存)。 GPU可以比CPU执行数十亿次的SHA256哈希值更快地执行数十亿的SHA256哈希值。

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

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

AMD GCN架构甚至没有全速运行,直到你有至少64个工作项目,并且可以说你真的需要256个工作项来最大化44个计算单位中的一个......比如R9 290x

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