如何使用openmp并行biginteger?

时间:2019-06-03 22:23:33

标签: parallel-processing openmp biginteger

我需要并行运行从I: biginteger := 1到一些biginteger值的代码。由于它是biginteger,因此我无法使用parallel,并且omp for似乎无法在while循环中使用。

在尝试改善单声道工作的代码上有一点问题。 完成修复后,我将在此处进行更新以详细说明所有内容。

1 个答案:

答案 0 :(得分:0)

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

您总是可以做的事情就是这样的模式(假设大整数称为bigint,并且具有重载的算术运算符)。以下仅是伪代码来说明这一点,您必须将其调整为要使用的实际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);
        }
    }
}

其背后的主要思想是您手动遍历要处理的大整数空间。这是由一个线程完成的。对于每个数字(或一堆数字;模式显然会更复杂),您会产生一个OpenMP任务来为该数字做实际的工作。

此方法的效果在某种程度上取决于您实际对每个数字执行的操作。如果仅执行少量操作,则任务创建的成本可能会很高,因此您需要为一组数字生成任务。

希望有帮助!