对于图像处理,我有一个 openmp 并行循环贯穿图像的每一行。在循环内我使用 SSE 内在函数:
#pragma omp parallel for
for( int y=0; y<=img->height; y++ )
{
[SSE Code]
}
从 SSE 切换到 FPU 代码时,我需要使用 _mm_empty。我的理解是openmp使用的每个cpu都需要执行_mm_empty。
我当前的代码显然是错误的:
#pragma omp parallel for
for( int y=0; y<=img->height; y++ )
{
[SSE Code]
}
_mm_empty();
只有一个 CPU 会重新初始化其 FPU。
到目前为止,我想出的最佳解决方案有性能损失:
#pragma omp parallel for
for( int y=0; y<=img->height; y++ )
{
[SSE Code]
_mm_empty();
}
这将为每个循环迭代调用 _mm_empty。我期待 OpenMP 创建一个线程池,其中包含与可用 CPU 一样多的线程,并在它们之间分配工作。例如,具有 720 行和 4 个 CPU 的图像,这将导致 _mm_empty 被执行 720 次,而不是所需的 4 次。
OpenMP 中是否有任何定义清理代码的概念,由每个线程执行?就像是
#pragma omp parallel for on thread exit( _mm_empty(); )
for( int y=0; y<=img->height; y++ )
{
[SSE Code]
}
或者有没有办法用其他 omp 概念来表达这一点?