c++ - 基本的 openmp 程序运行速度较慢

标签 c++ parallel-processing openmp

<分区>

我正在努力让我的程序运行得更快,所以我将使用并行计算。在此之前,我尝试使用简单的 for 循环,但它运行速度较慢。

打开 mp 之前:

int a[100000] = { 0 };
clock_t begin = clock();

for (int i = 0; i < 100000; i++)
{
    a[i] = i;
}


clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
printf("%lf", elapsed_secs);

打开 mp 后:

int a[100000] = { 0 };
clock_t begin = clock();


#pragma omp parallel for
for (int i = 0; i < 100000; i++)
{
    a[i] = i;
}


clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
printf("%lf", elapsed_secs);

最佳答案

您说您的代码运行速度较慢,但​​您实际上并不知道。原因是您使用 clock() 来测量时间,并且此函数计算当前线程的 CPU 时间 并且可能是所有线程之一生成。要评估加速,您需要测量的是经过的挂钟时间。为此,OpenMP 为您提供了 omp_get_wtime()。尝试在您的代码中使用它,然后您就会真正了解您的代码是否从 OpenMP 中获得任何好处。

现在,让我们明确一点,您的代码只不过是写入内存。因此,您很有可能很快就会使内存带宽饱和。因此,除非您有多个内存 Controller ,否则在这种情况下您不太可能从添加线程中获益良多。请看this answer说服自己。

最后,请确保在退出代码之前对数据进行了一些处理,否则,编译器可能会对其进行优化,导致代码几乎什么都不做(但速度非常快)。

关于c++ - 基本的 openmp 程序运行速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828494/

相关文章:

c++ - boost 异质单位 - Bar per Minute

c - MPI 仅从 SELECT 处理器收集

fortran - 是否可以让 Fortran 源代码检测编译器标志?

java - 如何在 Java 代码中使用 OpenMP?

c - 使用 openMP 并行计算前缀和(c 代码)

c++ - gdb 调试异常

c++ - 使用bgl与dfs构建搜索树

c++ - 带有 enumwindows 接口(interface)和进程的程序列表

groovy - Jenkinsfile管道DSL : How to Show Multi-Columns in Jobs dashboard GUI - For all Dynamically created stages - When within PIPELINE section

r - 运行文档中的 doRedis 示例时出现 TryCatch 和名称错误