OpenMP 使用小结

1.测试代码

    double t1 = omp_get_wtime();
    time_t t3 = time(NULL);
    clock_t start;
    start = clock();
#pragma omp parallel for num_threads(5) schedule(static)
    for (int i = 0; i < num; i++)
    {
//#pragma omp parallel for num_threads(5) schedule(static)
        for (int k = 0; k < num; k++)
        {
            for (int j = 0; j < total; j++)
            {
                ss[i*num+k] += nu[j];

            }
            printf("thread: %d\n", omp_get_thread_num());
            printf("%f\n", ss[i]);
        }
    }

    double t2 = omp_get_wtime();
    printf("omp time: %lf\n", t2 - t1);

    clock_t finish = clock();
    printf("clock :%f\n", (double)(finish - start) / CLOCKS_PER_SEC);
    time_t t4 = time(NULL);
    printf("c time: %d\n", t4 - t3);

  这是我测试OpenMP加速效果的主要代码部分,不是很难的代码,就不附完整代码了,没什么意思。主要想通过这个例子总结一下自己使用OpenMP加速遇到的问题和一些收获。

2.时间测试

  网上面有的博客说c语言的clock()函数在给使用OpenMP的代码计时时时间不对,好在我一开始使用的是time()函数,这里我做了一个小实验,就是上面的代码,运行后:
这里写图片描述
  可以看到其实三个计时函数得到的时间几乎是一致的,所以计时使用哪个函数都是可以的,至于网上的说法,如果觉得不保险,那就用omp_get_wtime()函数。

3.OpenMP加速效果

  这是最重要的部分,之所以会有这篇博客,就是因为之前使用OpenMP不仅没有加速,反而慢了很多倍,所以就想做个小实验看看究竟是什么问题。

(1)使用OpenMP

这里写图片描述

(2)不使用OpenMP

这里写图片描述
  依旧是1中的代码,可以看到使用多线程以后加速效果很不错,大概提速了三倍,我们这里使用了5个线程,理想条件下是要快5倍,但是并行化要做很多准备,这段额外消耗时间会影响加速效果。
  还有一个很影响加速效果的地方,就是并行化的位置,敲个黑板,这是我这个实验收获最大的地方:

(3)外层for循环并行化

前面已经测试过了,就把(1)图再粘一次:
这里写图片描述

(4)内层for循环并行化

这里写图片描述
  (3)和(4)对比很明显,内层循环并行化并没有很大的速度提升,我开始一直在对内层循环做并行化,效果比上面图片的结果更差,后来想着要不换个位置试试,没想到提升那么明显,所以大家在写代码的时候,可以多试试,这样收获比道听途说肯定多的多。

你可能感兴趣的:(并行化)