我有一个并行实用程序类,我希望能够使用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版本中?