Статическая библиотека с несколькими файлами .h и .cu не может разрешать функции

При компиляции статической библиотеки с несколькими файлами .h и .cu я получаю неразрешенную функцию extern. Вот короткий пример, который повторяет ошибку.

Похоже, я не могу заставить Nsight Eclipse Edition сначала скомпилировать extrafunctions.cu. В моем полном проекте файл с дополнительными функциями является компилируется первым, но он все равно выдает невозможную обработку ошибки внешней функции.

Вот вывод для этого образца:

**** Build of configuration Debug for project linkerror ****

make all
Building file: ../cudatest.cu
Invoking: NVCC Compiler
nvcc -I/usr/local/cuda/include -G -g -O0 -gencode arch=compute_30,code=sm_30 -odir "" -M -o "cudatest.d" "../cudatest.cu"nvcc --compile -G -I/usr/local/cuda/include -O0 -g -gencode arch=compute_30,code=compute_30 -gencode arch=compute_30,code=sm_30  -x cu -o  "cudatest.o" "../cudatest.cu"../cudatest.cu(19): warning: variable "devInts" is used before its value is set

../cudatest.cu(19): warning: variable "devInts" is used before its value is set

ptxas fatal   : Unresolved extern function '_Z9incrementi'
make: *** [cudatest.o] Error 255

**** Build Finished ****

cudatest.h:

#ifndef CUDAPATH_H_
#define CUDAPATH_H_

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"
void test();#endif /* CUDAPATH_H_ */

cudatest.cu:

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"
__global__ void kernel(int* devInts){
int tid = threadIdx.x + (blockDim.x*blockIdx.x);

if (tid == 0){
for(int i = 0; i < NUMINTS; i++){
devInts[i] = increment(devInts[i]);
}
}
}

void test(){

int* myInts = (int*)malloc(NUMINTS * sizeof(int));
int* devInts;
cudaMemcpy((void**)devInts, myInts, NUMINTS*sizeof(int), cudaMemcpyHostToDevice);
kernel<<<1,1>>>(devInts);
int* outInts = (int*)malloc(NUMINTS * sizeof(int));
cudaFree(devInts);
free(myInts);
free(outInts);
}

extrafunctions.h:

#ifndef EXTRAFUNCTIONS_H_
#define EXTRAFUNCTIONS_H_

#include <cuda.h>
#include <cuda_runtime.h>

#define NUMINTS 4

int __device__ increment(int i);

#endif /* EXTRAFUNCTIONS_H_ */

extrafunctions.cu:

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"

int __device__ increment(int i){
return i+1;
}

1

Решение

Вам нужно явно включить отдельную компиляцию, чтобы это работало. Щелкните правой кнопкой мыши свой проект, «Свойства», «Build-> CUDA» и выберите режим компоновки «Отдельная компиляция».

Обратите внимание, что отдельная компиляция работает только на графических процессорах SM 2.0+ и может генерировать только SASS (например, невозможно создать PTX, который будет совместим с будущими устройствами CUDA). Для получения дополнительной информации, пожалуйста, прочитайте «Использование отдельной компиляции в CUDA» в Руководство NVCC.

Обновить
Для связи кода устройства необходимо использовать компоновщик NVCC, поэтому компоновщик GCC не работает. В Nsight вы можете либо связать все приложение с помощью NVCC, либо настроить проект статической библиотеки, который содержит весь код CUDA и который построен с использованием Tollchain NVCC и обычного проекта C / C ++, который использует GCC и ссылки на статическую библиотеку, созданную из первого проекта.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]