Возьмут следующий код, который иллюстрирует призвание простой рутины на ускорителе, составленный на устройстве с помощью OpenACC 2.0 в routine
директиву:OpenACC 2,0 рутина: данные местонахождение
#include <iostream>
#pragma acc routine
int function(int *ARRAY,int multiplier){
int sum=0;
#pragma acc loop reduction(+:sum)
for(int i=0; i<10; ++i){
sum+=multiplier*ARRAY[i];
}
return sum;
}
int main(){
int *ARRAY = new int[10];
int multiplier = 5;
int out;
for(int i=0; i<10; i++){
ARRAY[i] = 1;
}
#pragma acc enter data create(out) copyin(ARRAY[0:10],multiplier)
#pragma acc parallel present(out,ARRAY[0:10],multiplier)
if (function(ARRAY,multiplier) == 50){
out = 1;
}else{
out = 0;
}
#pragma acc exit data copyout(out) delete(ARRAY[0:10],multiplier)
std::cout << out << std::endl;
}
Как function
знать, чтобы использовать копии устройства ARRAY[0:10]
и multiplier
, когда он вызывается из параллельной области? Как мы можем обеспечить использование экземпляров устройства?