Parallel processing 使用OpenMP“;对于simd“而言;在矩阵向量乘法中?

Parallel processing 使用OpenMP“;对于simd“而言;在矩阵向量乘法中?,parallel-processing,openmp,vectorization,simd,xtensor,Parallel Processing,Openmp,Vectorization,Simd,Xtensor,我目前正试图通过将#pragma omp for与#pragma omp simd相结合,使我的矩阵向量乘法函数与BLAS相比较,但与仅使用for构造相比,它没有得到任何加速改进。如何使用OpenMP的SIMD构造正确地矢量化内部循环 矢量点(常数矩阵和A、常数矢量和x) { 断言(A.shape(1)=x.size()); 向量y=xt::零({A.shape(0)}); int i,j; #pragma omp并行共享(A,x,y)私有(i,j) { #//计划的pragma omp(静态)

我目前正试图通过将
#pragma omp for
#pragma omp simd
相结合,使我的矩阵向量乘法函数与BLAS相比较,但与仅使用for构造相比,它没有得到任何加速改进。如何使用OpenMP的SIMD构造正确地矢量化内部循环

矢量点(常数矩阵和A、常数矢量和x)
{
断言(A.shape(1)=x.size());
向量y=xt::零({A.shape(0)});
int i,j;
#pragma omp并行共享(A,x,y)私有(i,j)
{
#//计划的pragma omp(静态)
对于(i=0;i
您的指令不正确,因为会引入竞争条件(在
y(i)
)。在这种情况下,您应该使用还原。以下是一个例子:

矢量点(常数矩阵和A、常数矢量和x)
{
断言(A.shape(1)=x.size());
向量y=xt::零({A.shape(0)});
int i,j;
#pragma omp并行共享(A,x,y)私有(i,j)
{
#//计划的pragma omp(静态)
对于(i=0;i
请注意,可能不需要更快,因为某些编译器能够自动矢量化代码(例如ICC)。GCC和Clang通常无法自动执行(高级)SIMD缩减,这样的指令对他们有一定帮助。您可以检查汇编代码,以检查代码是如何矢量化的,或者启用矢量化报告(请参见GCC)