Я использую Intel C ++ Compiler v14.0.3. Этот следующий код беспокоит меня:
#include <tinyxml/tinyxml.h>
#include <memory>
#include <map>
#include "offload.h"using namespace std;
typedef map<shared_ptr<TiXmlDocument>, double,
less<shared_ptr<TiXmlDocument> >,
__offload::shared_allocator<pair<shared_ptr<TiXmlDocument>, double> > > xmlanddbl;
__declspec(target(mic)) _Cilk_shared xmlanddbl m;
int main(void)
{
const int maxct = 10;
for(int i = 0; i < 10; i++){
shared_ptr<TiXmlDocument> doc(new TiXmlDocument);
if(doc && doc->LoadFile("something.xml")){
m.insert(make_pair(doc, 0.0));
}
}
for(int ct = 0; ct < maxct; ct++){
#pragma offload target(mic) mandatory
#pragma omp parallel
#pragma omp single
{
for(auto it = m.begin(); it != m.end(); it++){
#pragma omp task firstprivate(it)
{
someclass obj(it->first);
it->second = obj.eval();
}
}
#pragma omp taskwait
}
somefunction(m);
}
return 0;
}
Компилятор выдает это сообщение:
$ icpc -c thiscode.cpp -O2 -openmp -parallel -std=c++11 -I./include
thiscode.cpp(24): error: variable "m" used in this offload region is not bitwise copyable
#pragma offload target(mic) mandatory
^
compilation aborted for thiscode.cpp (code 2)
я прочел эта страница. Но я не мог придумать, как передать эти данные.
Что я могу сделать?
Извините за мой плохой английский.
Спасибо.
Я не мог придумать, как передать эти данные. Что я могу сделать?
Из документа, на который вы ссылаетесь:
«Если данные, которыми обмениваются ЦП и сопроцессор, являются более сложными, чем простые скаляры и побитовые копируемые массивы, вы можете рассмотреть возможность использования конструкций _Cilk_shared / _Cilk_offload».
#pragma offload
не будет работать, потому что std :: map слишком сложен для побитового копирования.