OpenACC использует библиотеку math.h
Привет, я использовал компиляторы CAPS OpenACC, но, похоже, компилятор не может связать функции со стандартным math.h.
На самом деле, в моем случае, функция sqrt используется в моем коде в цикле ускорения. Когда я компилирую код, выдается ошибка ниже:
/tmp/cc8L0aKZ.o:compute_fluxes_XrxAnW.translated.i:function _flux_function_central: error: undefined reference to 'sqrt'
Кто-нибудь получить какие-то решения?
Спасибо!
3 ответа
Весь код акселератора должен быть помечен как таковой с помощью обычной директивы. В противном случае компилятор не сгенерирует код устройства для него. У PGI есть статья, объясняющая, как с этим бороться.
Вы можете прочитать статью или просто попробовать добавить следующее с другими объявлениями верхнего уровня в вашем коде:
#pragma acc routine(sqrt) seq
Пожалуйста, повторите с
caps capsmc --openacc-target CUDA --io-report -Xnvcc -arch=sm_13 -c --force gcc -std=c99 -L/usr/include/math.h **-lm** compute_fluxes.c -o cf.13
(-lm
собственно ссылки со стандартной математической библиотекой)
Приведенная ниже простая программа компилируется и отлично работает на последней версии Nvidia HPC SDK 22.7 без каких-либо дополнительных настроек.routine
директивы или дополнительные флаги компиляции.
$ pgc++ -acc -gpu=managed -Minfo=all sqrt-acc.cpp -o sqrt-acc.out && ./sqrt-acc.out
Программа сsqrt
#include <math.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]){
int n = 100000;
double* d = (double*) malloc (sizeof(double) *n);
double* s = (double*) malloc (sizeof(double) *n);
#pragma acc data create(d[:n], s[:n]) copyout(s[0:n])
{
#pragma acc parallel loop
for (unsigned i = 0; i < n; ++i) {
d[i] = i;
}
#pragma acc parallel loop
for (unsigned i = 1; i < n; ++i) {
s[i] = sqrt(d[i]);
}
}
for (unsigned i = 0; i < 10; ++i) {
std::cout<< i << ": " << s[i] << '\n';
}
return 0;
}
Выход.
0: 0
1: 1
2: 1.41421
3: 1.73205
4: 2
5: 2.23607
6: 2.44949
7: 2.64575
8: 2.82843
9: 3