如何使用 openmp 并行 biginteger?

How can I parallel biginteger using openmp?

我需要 运行 从 I: biginteger := 1 到一些 biginteger 值的并行代码。因为它是一个双整数,所以我无法使用 parallel for 并且 omp for 似乎不适用于 while 循环。

尝试改进单声道工作的代码时遇到一点问题.... 完成修复后,我会在此处发布更新,详细解释所有内容。

我只能评论问题的 OpenMP 部分,实际上您只能(直接)并行化使用常规整数(int、long、...)作为循环计数器类型的 OpenMP 循环。这适用于所有 OpenMP 循环语句,例如 fortaskloop

你总是可以做的一件事是像这样的模式(假设大整数被称为 bigint 并且有重载算术运算符)。以下只是 pseudo-code 来展示这个想法,您必须将其调整为您想要使用的实际 API:

void process_bigint() {
    binint i;
    bigint start = some_start_value();
    binint end   = some_end_value();

    i = start;
    #pragma omp parallel
    #pragma omp single
    while(i < end) {
        #pragma omp task firstprivate(i)
        {
            process_bigint(i);
        }
    }
}

这背后的主要思想是您手动迭代要处理的大整数 space。这是由一个线程完成的。对于每个数字(或一串数字;模式会稍微复杂一些),您生成一个 OpenMP 任务来为该数字执行实际工作。

这项工作的效果多少取决于您实际对每个数字执行的操作。如果只是一些操作,创建任务的成本可能太高,您需要为一组数字生成一个任务。

希望对您有所帮助!