Я пытаюсь написать объектно-ориентированный код на C++, который распараллелен OpenACC. Мне удалось найти некоторые вопросы о стеке и вопросы GTC на OpenACC, но я не смог найти примеры реальных объектов объектно-ориентированного кода.OpenACC и объектно-ориентированный C++
В this question был показан пример для OpenACCArray
, который выполняет некоторое управление памятью в фоновом режиме (код доступен по адресу http://www.pgroup.com/lit/samples/gtc15_S5233.tar). Однако мне интересно, возможно ли создать класс, который управляет массивами на более высоком уровне. Например.
struct Data
{
// OpenACCArray<float> a;
OpenACCArray<Vector3<float>> a3;
Data(size_t len) {
#pragma acc enter data copyin(this)
// a.resize(len);
a3.resize(len);
}
~Data() {
#pragma acc exit data delete(this)
}
void update_device() {
// a.update_device();
a3.update_device();
}
void update_host() {
// a.update_host();
a3.update_host();
}
};
int main(int argc, char *argv[])
{
const size_t len = 32*128;
Data d(len);
d.update_device();
#pragma acc kernels loop independent present(d)
for (int i=0; i < len; ++i) {
float val = (float)i/(float)len;
d.a3[i].x = val;
d.a3[i].y = i;
d.a3[i].z = d.a3[i].x/d.a3[i].y;
}
d.update_host();
for (int i=0; i < len/128; ++i) {
cout << i << ": " << d.a3[i].x << "," << d.a3[i].y << "," << d.a3[i].z << endl;
}
cout << endl;
return 0;
}
Интересно эта программа работает, но как только я раскомментировать OpenACCArray<float> a;
, то есть добавить еще один элемент в этих структуры данных, я получаю ошибку памяти. FATAL ERROR: variable in data clause is partially present on the device
.
Поскольку структура OpenACCArray
является плоской структурой, которая сама по себе обрабатывает указатели, она должна работать, чтобы скопировать ее в качестве члена? Или нужно быть указателем на структуру, и указатели должны быть связаны с директивами? Тогда я боюсь проблемы, что я должен использовать указатели псевдонимов, как предложил Джефф Ларкин в the above mentioned question. Я не прочь сделать работу, чтобы запустить ее, но я не могу найти ссылку, как это сделать. Использование директив компилятора keepgpu,keepptx
помогает немного понять, что делает компилятор, но я предпочел бы альтернативу обратному инженерному генерированному ptx-коду.
Любые указатели на полезный справочный проект или документы высоко оценены.
Какую версии на OpenACCArray вы используете из этого примера тарболла? – jefflarkin
Кроме того, можете ли вы указать свое определение для Vector3? Я сделал предположение, но хотел бы подтвердить, что мы строим одно и то же. – jefflarkin
@jefflarkin благодарит вас за помощь. Я использовал собственный класс, но изменил код, чтобы использовать float3 из вашего примера 2 в tarball. Вот суть с кодом https://gist.github.com/danielwinkler/12ab5b73221faca89d69d83d72c633b7 – dwn