我需要并行运行从I: biginteger := 1
到一些biginteger值的代码。由于它是biginteger,因此我无法使用parallel,并且omp for
似乎无法在while循环中使用。
在尝试改善单声道工作的代码上有一点问题。 完成修复后,我将在此处进行更新以详细说明所有内容。
答案 0 :(得分:0)
我只能评论问题的OpenMP部分,实际上,您只能(直接)并行化使用常规整数(int,long,...)作为循环计数器类型的OpenMP循环。这适用于所有OpenMP循环语句,例如for
,taskloop
等。
您总是可以做的事情就是这样的模式(假设大整数称为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任务来为该数字做实际的工作。
此方法的效果在某种程度上取决于您实际对每个数字执行的操作。如果仅执行少量操作,则任务创建的成本可能会很高,因此您需要为一组数字生成任务。
希望有帮助!