任务是使用 p 线程并行化矩阵乘法并使用英特尔 ISPC 编译器进行矢量化

Posted

技术标签:

【中文标题】任务是使用 p 线程并行化矩阵乘法并使用英特尔 ISPC 编译器进行矢量化【英文标题】:Task is to parallelize matrix multiplication with p-threads and vectorized with Intel ISPC compiler 【发布时间】:2020-04-24 18:39:28 【问题描述】:

在 .ispc 文件中使用 pthread 会产生如下错误: (1) t.ispc:2:13: Error: Illegal to return a "varying" or vector type 从导出的函数“matrix_mult_pl” 导出 void * matrix_mult_pl( void *arg )

(2) t.ispc:2:36: 错误:可变指针类型参数“arg”是 在导出的函数中是非法的。 导出 void * matrix_mult_pl( void *arg )

(3) t.ispc:6:11:错误:语法错误,意外的“int”。 tid = *(int *)(arg); // 获取顺序分配的线程 ID。 ^^^

还有更多错误。编码器附在下面。 请研究在 ISPC 中使用 pthreads 的问题。

线程.c 文件
/**
 * Thread routine.
 * Each thread works on a portion of the 'matrix1'.
 * The start and end of the portion depend on the 'arg' which
 * is the ID assigned to threads sequentially. 
 */
void * matrix_mult_pl( void *arg )

  int rows, cols, j, tid, portion_size, row_start, row_end;

  tid = *(int *)(arg); // get the thread ID assigned sequentially.
  portion_size = size / num_threads;
  row_start = tid * portion_size;
  row_end = (tid+1) * portion_size;

  for (rows = row_start; rows < row_end; ++rows)  // hold row index of 'matrix1'
    for (j = 0; j < size; ++j)  // hold column index of 'matrix2'
     // hold value of a cell
      /* one pass to sum the multiplications of corresponding cells
     in the row vector and column vector. */
      for(cols=0; cols<size; cols++)  
        result_pl[ rows ][ cols ] += matrix1[ rows ][ j ] * matrix2[ j ][ cols ];
      
    
  

threads.ispc 文件

export void * matrix_mult_pl( void *arg )

  int rows, cols, j, tid, portion_size, row_start, row_end;

  tid = *(int *)(arg); // get the thread ID assigned sequentially.
  portion_size = size / num_threads;
  row_start = tid * portion_size;
  row_end = (tid+1) * portion_size;

  for (rows = row_start; rows < row_end; ++rows)  // hold row index of 'matrix1'
    for (j = 0; j < size; ++j)  // hold column index of 'matrix2'
     // hold value of a cell
      /* one pass to sum the multiplications of corresponding cells
     in the row vector and column vector. */
      for(cols=0; cols<size; cols++)  
        result_pl[ rows ][ cols ] += matrix1[ rows ][ j ] * matrix2[ j ][ cols ];
      
    
  

为什么ISPC文件没有通过pthreads并行化执行向量化?

【问题讨论】:

为了最大限度地帮助我们,您应该将其减少为Minimal, Reproducible Example。这样做你甚至可能会发现问题。 我对代码做了一些更改,以便您可以轻松理解我要实现的内容。 【参考方案1】:

您遇到的问题是因为 ISPC 默认为 varying 类型。 int x = 0varying int x = 0 相同。这也适用于指针类型 void *argvoid varying * uniform arg ,并且您不能在导出的函数中使用不同的类型。移植和首次开始使用 ISPC 时,最好使用 uniformvarying 关键字。

【讨论】:

很高兴听到这个消息!此外,如果您将来遇到问题,ispc-users Google Group 可能是寻求反馈的最佳场所。

以上是关于任务是使用 p 线程并行化矩阵乘法并使用英特尔 ISPC 编译器进行矢量化的主要内容,如果未能解决你的问题,请参考以下文章

使用 openmp 并行化矩阵乘法并使用 avx2 进行矢量化

OpenMP 矩阵向量乘法仅在一个线程上执行

OpenMP 矩阵乘法嵌套循环

在矩阵乘法中使用 C++2011 线程而不是 OpenMP 时出现异常加速

矩阵向量乘法的更快实现【并行计算】

需要帮助使用 MPI 调试并行矩阵乘法