У меня есть код CUDA, в который я хотел бы включить внешний код, который состоит из Fortran с ядрами OpenA CC. У меня есть два файла со следующим контентом, вдохновленным обсуждением на сайте NVIDIA. Файл main.cu
имеет следующий вид:
#include <cstdio>
extern "C" void saxpy(int*, float*, float*, float*);
int main(int argc, char **argv)
{
float* x;
float* y;
float* dx;
float* dy;
int n = 1<<20;
x = (float*) malloc(n*sizeof(float));
y = (float*) malloc(n*sizeof(float));
for (int i=0; i<n; ++i)
{
x[i] = 1.f;
y[i] = 0.f;
}
cudaMalloc((void**) &dx, (size_t) n*sizeof(float));
cudaMalloc((void**) &dy, (size_t) n*sizeof(float));
cudaMemcpy(dx, x, (size_t) n*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(dy, y, (size_t) n*sizeof(float), cudaMemcpyHostToDevice);
float factor = 2.f;
saxpy(&n, &factor, dx, dy);
cudaMemcpy(y, dy, (size_t) n*sizeof(float), cudaMemcpyDeviceToHost);
printf("%f, %f\n", y[0], y[n-1]);
return 0;
}
Второй файл saxpy.f90
:
subroutine saxpy(n, a, x, y) bind(c, name="saxpy")
use iso_c_binding, only: c_int, c_float
integer(kind=c_int), intent(in) :: n
real(kind=c_float), intent(in) :: a
real(kind=c_float), dimension(n), intent(in) :: x(n)
real(kind=c_float), dimension(n), intent(inout) :: y(n)
!$acc parallel deviceptr(x, y)
do i = 1, n
y(i) = y(i) + a*x(i)
end do
!$acc end parallel
end subroutine
Как мне скомпилировать nvcc
и комбинированный PGI-компилятор? Я пробовал много разных вариантов, но я всегда заканчивал неразрешенными внешними данными.
Я пытался: pgf90 -ta=tesla:cc35 -acc saxpy.f90 -c
для файла на Фортране, и это прекрасно компилируется. Следующий шаг, где я застрял. Это: nvcc -arch=sm_35 -ccbin pgc++ main.cu saxpy.o
дает нерешенные внешние факторы, для которых я не уверен, как ее решить Как я могу узнать, какие внешние библиотеки включить?