gpt4 book ai didi

c - 在并行化矩阵乘法时,虚拟内核是否对性能有所贡献?

转载 作者:行者123 更新时间:2023-12-03 12:55:33 25 4
gpt4 key购买 nike

我在O(n^3)中有一个C矩阵乘法函数。

void matrixMultiplication(int N, double **A, double **B, double **C, int threadCount) {
int i = 0, j = 0, k = 0, tid;

pragma omp parallel num_threads(4) shared(N, A, B, C, threadCount) private(i, j, k, tid) {
tid = omp_get_thread_num();
pragma omp for
for (i = 1; i < N; i++)
{
printf("Thread %d starting row %d\n", tid, i);
for (j = 0; j < N; j++)
{
for (k = 0; k < N; k++)
{
C[i][j] = C[i][j] + A[i][k] * B[k][j];
}
}
}
}
return;
}

我正在使用 OpenMP通过拆分乘法来并行化此函数。我正在使用 N = 3000处理器在 1.8 GHz Intel Core i5大小的平方矩阵上执行此计算。

该处理器具有两个物理核心和两个虚拟核心。我的计算发现了以下性能
  • 1个线程:526.06s
  • 2个线程:264.531
  • 3个线程:285.195
  • 4个线程:279.914

  • 我曾期望我的 yield 会继续下去,直到将线程数设置为等于4为止。但是,这显然没有发生。

    为什么会这样呢?是否因为核心的性能等于其物理核心与虚拟核心的总和?

    最佳答案

    每个内核使用一个以上的硬件线程可能会有所帮助或受到损害,具体取决于情况。

    如果一个硬件线程由于高速缓存未命中而停顿,而另一个硬件线程可以继续运行并保持ALU繁忙,则可以提供帮助。

    如果每个硬件线程强制驱逐另一个线程所需的数据,则可能会造成伤害。那就是线程之间的破坏性干扰。

    解决该问题的一种方法是编写内核,以使每个线程仅需要一半的缓存。例如,可以使用分块矩阵乘法来最小化矩阵乘法的缓存占用空间。

    另一种方法是以这样一种方式编写算法,即两个线程同时对同一数据进行操作,因此它们彼此帮助将数据带入缓存(相长干扰)。除非实现对嵌套并行性有良好的支持,否则使用OpenMP很难采用这种方法。

    关于c - 在并行化矩阵乘法时,虚拟内核是否对性能有所贡献?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28548299/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com