OpenACC и C++: работают ли вместе?
Для С++ вполне логично было бы использовать для хранения данных не голые массивы, а классы типа std::vector или какие-нибудь самопальные велосипеды. А вычисления над этими данными реализовывать в каком-нибудь другом классе, который будет данные доставать через методы типа operator[]. Вопрос: реально ли подобную иерархию классов/объектов протащить на GPU с помощью OpenACC? Я что-то попытался и потерпел фиаско, но я в OpenACC нуб, так что не показатель. Если кто умеет готовить OpenACC и C++, гляньте, пожалуйста, что не так с моим кодом?
#define DATASIZE 16
class Data {
float *arr;
public:
Data() {
arr = new float[DATASIZE];
#pragma acc enter data copyin(this)
#pragma acc enter data create(arr[:DATASIZE])
}
~Data() {
#pragma acc exit data delete(arr)
#pragma acc exit data delete(this)
delete [] arr;
}
float &get(int i) { return arr[i]; }
};
class DataKeeper {
Data a, b;
public:
DataKeeper() {
#pragma acc enter data copyin(this)
}
~DataKeeper() {
#pragma acc exit data delete(this)
}
void init() {
#pragma acc parallel loop
for (int i = 0; i < DATASIZE; ++i) {
a.get(i) = i*i;
}
}
};
int main() {
DataKeeper DK;
DK.init();
}
_T29790288_118 lives at 0x7fffb818be00 size 16 partially present
Present table dump for device[1]: NVIDIA Tesla GPU 0, compute capability 3.5, threadid=1
host:0x7fffb818be00 device:0xc05da0000 size:8 presentcount:0+1 line:11 name:_T29788448_113
host:0x7fffb818be08 device:0xc05da0200 size:8 presentcount:0+1 line:11 name:_T29788448_113
allocated block device:0xc05da0000 size:512 thread:1
allocated block device:0xc05da0200 size:512 thread:1
FATAL ERROR: variable in data clause is partially present on the device: name=_T29790288_118
file:/home/bozhenovn/tst/test.cc _ZN10DataKeeperC1Ev line:28
Код компилится, но крешится на исполнении. И я понятия не имею не только, что произошло, но и как получить больше информации, чтобы понять, что случилось.
Буду признателен за любую помощь по делу.