我尝试使用OpenMP将for循环计算拆分为多个线程。另外,我试图指示编译器对分配给每个线程的每个块进行矢量化。代码如下:
#pragma omp for private(i)
__pragma(loop(ivdep))
for (i = 0; i < 4096; i++)
vC[i] = vA[i] + SCALAR * vB[i];
问题在于,两个编译指示都会期待for循环。
是否有任何智能构造可以使这项工作?
有些人可能会争辩说,由于使用OpenMP进行for循环分割,循环的矢量化不会起作用。但是我读到 #pragma omp for 将循环划分为多个等于线程数的连续块。 是thitt吗?
答案 0 :(得分:2)
如何使用#pragma omp for simd private(i)
代替pragma + __pragma()?
编辑:由于OpenMP 4似乎不适合您,您可以手动拆分循环以通过使用{{1}手动计算索引限制来摆脱#pragma omp for
}和omp_get_num_threads()
,然后为每个线程循环保留omp_get_thread_num()
。
编辑2:因为我是个好人,因为这是样板(在MPI中编程时更常见,但仍然如此)但是当你第一次做到这一点时非常烦人,这是一个可能的解决方案:
ivdep