使用std :: function时C ++ OpenMP链接器错误

时间:2016-06-24 13:19:18

标签: c++ openmp

我有一个并行实用程序类,我希望能够使用future或openmp,具体取决于系统上可用的内容。未来的代码工作正常,但是当我将函数指针传递给openmp时,我得到一个链接器错误,(但是如果我将openmp for循环直接应用于函数则没有错误。 以下是实用程序文件中并行循环函数的代码:

#include "ParallelUtils.h"

#define _OPENMP // just for testing, openmp is installed and verified working
#if defined(_OPENMP)
#include <omp.h>
#elif defined(_WIN32)
#include <Windows.h>
#else
#include <future>
#endif

void ParallelUtils::ParallelFor(size_t From, size_t To, const std::function<void(size_t)> &F)
{
#if defined(_OPENMP)
    #pragma omp parallel for num_threads(To)
    {
        size_t i = omp_get_thread_num();
        F(i);
    }
#elif defined(_WIN32)
    concurrency::parallel_for(From, To, [&](size_t i)
    {
        F(i);
    });
#else
    std::vector<std::future<void>> futures;

    for (size_t i = From; i < To; ++i)
    {
        auto fut = std::async([i, F]()
        {
            F(i);
        });
        futures.push_back(std::move(fut));
    }

    for (size_t i = 0; i < futures.size(); ++i)
        futures[i].wait();

    futures.clear();
#endif
}

同样,如果我直接将它应用于该函数,它可以正常工作,例如

        #pragma omp parallel shared(this, &Input, InOffset, blkLen), num_threads(m_treeParams.ThreadDepth())
        {
            size_t i = omp_get_thread_num();
            ProcessLeaf(Input, InOffset + (i * blkLen), m_hashChain, i * CHAIN_SIZE, blkLen);
        }

所以有两个问题,我做错了什么,并且,我需要做些什么才能将共享变量添加到函数的openmp版本中?

0 个答案:

没有答案