我有一个相当简单的for循环,用C语言对一个非常大的双精度值x
(x
mio数据点)数组求和.我希望使用指定数量的线程,在减少SIMD的同时执行这项工作.在我的阅读中,OpenMP指令应该是:
int nthreads = 4, l = 1e8;
double sum = 0.0;
#pragma omp parallel for simd num_threads(nthreads) reduction(+:sum)
for (int i = 0; i < l; ++i) sum += x[i];
但是,这会给出一个编译器警告
loop not vectorized: the optimizer was unable to perform the requested transformation; the transformation might be disabled or specified as part of an unsupported transformation ordering [-Wpass-failed=transform-warning]
并且用多个线程运行它比用单线程运行要慢.我使用的是带有clang
(Xclang
)v13.0.0编译器的Apple M1 Mac.我想知道的是:这是我的系统的问题,还是这条OpenMP指令真的有问题/不可行?