OpenMP 使用率低 CPU

OpenMP has low CPU usage

我的 OpenMP 实现显示出非常糟糕的性能。当我使用 vtune 分析它时,我的 CPU 使用率非常低,我不知道为什么。有人有想法吗?

硬件:

实施:

struct Lineitem {
    int64_t l_quantity;
    int64_t l_extendedprice;
    float l_discount;
    unsigned int l_shipdate;
};

Lineitem* array = (Lineitem*)malloc(sizeof(Lineitem) * array_length);

// 数组将被填充

#pragma omp parallel for num_threads(48) shared(array, array_length, date1, date2) reduction(+: sum)
for (unsigned long i = 0; i < array_length; i++)
{
     if (array[i].l_shipdate >= date1 && array[i].l_shipdate < date2 &&
         array[i].l_discount >= 0.08f && array[i].l_discount <= 0.1f &&
         array[i].l_quantity < 24)
         {
              sum += (array[i].l_extendedprice * array[i].l_discount);
         }
}

另外作为信息,我正在使用 cmake 和 clang。

现代 CPU 只有在有大量缓存数据需要重用时才会表现出高性能。由于您只是在数组上线性操作,因此没有这样的东西,并且您受到内存带宽的限制。您的核心确实会以其全部利用率的一小部分运行。

情况可能更糟:您有一个结构数组,您可以从中使用某些字段。如果有其他不使用的字段,您会发现没有完全使用从内存加载的缓存行的现象,再次将性能除以一个因素。请通过包含 structure/class.

的数据布局来修改您的问题

我找到了 OpenMP 性能不佳的原因。我 运行 我的 OpenMP 代码在固定到核心的线程中。如果我不将线程固定到核心,则 OpenMP 代码速度很快。

很可能OpenMP在固定线程中创建的线程也在固定线程所在的内核上执行。因此,整个 OpenMP 代码仅在一个具有多个线程的内核上运行。