当遵循以上全部建议后,实例代码的最终并行区域为:
#pragma omp parallel for schedule(dynamic,100) reduction(+:number_of_primes,number_of_41primes,number_of_43primes)
for (i = start; i <= end; i += 2) {
int limit, j, prime; // locally declared for private
limit = (int) sqrt((float)i) + 1;
prime = 1; /* assume number is prime */
j = 3;
while (prime && (j <= limit)) {
if (i%j == 0) prime = 0;
j += 2;
}
if (prime) {
if (print_primes) printf("%5d is prime/n",i);
number_of_primes++;
if (i%4 == 1) number_of_41primes++;
if (i%4 == 3) number_of_43primes++;
}
}
为获得该最终代码,首先采用英特尔® 线程检查器判断串行代码中是否具有可并行执行的循环,以及需要将哪些变量设为 private(私有)或采用独占访问进行保护。当完成对原始代码的更改后,通过英特尔® 线程档案器运行代码所获得的结果支持对并行执行的调试,以充分利用系统中的计算资源。
英特尔® 线程工具常常被认为能够迅速找出代码中的线程错误,并指出不明显的性能错误。通过在开发阶段较早地采用这些工具,您能够使系统自动运行这些枯燥的任务,从而在串行应用中找出于何处能够有效实施并行。