如何使用 openmp 并行 biginteger?
How can I parallel biginteger using openmp?
我需要 运行 从 I: biginteger := 1
到一些 biginteger 值的并行代码。因为它是一个双整数,所以我无法使用 parallel for 并且 omp for
似乎不适用于 while 循环。
尝试改进单声道工作的代码时遇到一点问题....
完成修复后,我会在此处发布更新,详细解释所有内容。
我只能评论问题的 OpenMP 部分,实际上您只能(直接)并行化使用常规整数(int、long、...)作为循环计数器类型的 OpenMP 循环。这适用于所有 OpenMP 循环语句,例如 for
、taskloop
等
你总是可以做的一件事是像这样的模式(假设大整数被称为 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 任务来为该数字执行实际工作。
这项工作的效果多少取决于您实际对每个数字执行的操作。如果只是一些操作,创建任务的成本可能太高,您需要为一组数字生成一个任务。
希望对您有所帮助!
我需要 运行 从 I: biginteger := 1
到一些 biginteger 值的并行代码。因为它是一个双整数,所以我无法使用 parallel for 并且 omp for
似乎不适用于 while 循环。
尝试改进单声道工作的代码时遇到一点问题.... 完成修复后,我会在此处发布更新,详细解释所有内容。
我只能评论问题的 OpenMP 部分,实际上您只能(直接)并行化使用常规整数(int、long、...)作为循环计数器类型的 OpenMP 循环。这适用于所有 OpenMP 循环语句,例如 for
、taskloop
等
你总是可以做的一件事是像这样的模式(假设大整数被称为 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 任务来为该数字执行实际工作。
这项工作的效果多少取决于您实际对每个数字执行的操作。如果只是一些操作,创建任务的成本可能太高,您需要为一组数字生成一个任务。
希望对您有所帮助!