我有一个相当简单的for循环,用C语言对一个非常大的双精度值x(xmio数据点)数组求和.我希望使用指定数量的线程,在减少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指令真的有问题/不可行?

推荐答案

当clang>;=15时,不会发出任何警告进行编译,但性能取决于系统.在Apple M1中,多线程似乎并没有增加多少SIMD向量化,而单线程执行#pragma omp simd reduction(+:sum)条指令就差不多了.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

为什么这个C程序代码会产生以下结果?

Ebpf内核代码:permission denied:invalid access to map value

为什么可以通过指向常量int的指针间接地改变整数的值?

DPDK-DumpCap不捕获端口上的传入数据包

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

什么是.c.h文件?

为什么这个分配做得不好呢?

为什么WcrTomb只支持ASCII?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

无算术运算符和循环的二进制乘法

为什么这个代码的最后一次迭代不能正常工作?

不兼容的整数到指针转换传递';char';到类型';常量字符*

将指针的地址加载到寄存器内联拇指组件中

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

如何向 execl 创建的后台程序提供输入?

如何使用 raylib 显示数组中的图像

`void foo(int a[static 0]);` 有效吗?