我努力尝试但没有成功。我希望有人可以帮助我实现这个目标。 我有两个源文件。
Main.cpp的
#include <stdio.h>
#include "Math.h"
#include <math.h>
#include <iostream>
int cuda_function(int a, int b);
int callKnn(void);
int main(void)
{
int x = cuda_function(1, 2);
int f = callKnn();
std::cout << f << std::endl;
return 1;
}
CudaFunctions.cu
#include <cuda.h>
#include <stdio.h>
#include "Math.h"
#include <math.h>
#include "cuda.h"
#include <time.h>
#include "knn_cuda_without_indexes.cu"
__global__ void kernel(int a, int b)
{
//statements
}
int cuda_function2(int a, int b)
{
return 2;
}
int callKnn(void)
{
// Variables and parameters
float* ref; // Pointer to reference point array
float* query; // Pointer to query point array
float* dist; // Pointer to distance array
int ref_nb = 4096; // Reference point number, max=65535
int query_nb = 4096; // Query point number, max=65535
int dim = 32; // Dimension of points
int k = 20; // Nearest neighbors to consider
int iterations = 100;
int i;
// Memory allocation
ref = (float *) malloc(ref_nb * dim * sizeof(float));
query = (float *) malloc(query_nb * dim * sizeof(float));
dist = (float *) malloc(query_nb * sizeof(float));
// Init
srand(time(NULL));
for (i=0 ; i<ref_nb * dim ; i++) ref[i] = (float)rand() / (float)RAND_MAX;
for (i=0 ; i<query_nb * dim ; i++) query[i] = (float)rand() / (float)RAND_MAX;
// Variables for duration evaluation
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
float elapsed_time;
// Display informations
printf("Number of reference points : %6d\n", ref_nb );
printf("Number of query points : %6d\n", query_nb);
printf("Dimension of points : %4d\n", dim );
printf("Number of neighbors to consider : %4d\n", k );
printf("Processing kNN search :" );
// Call kNN search CUDA
cudaEventRecord(start, 0);
for (i=0; i<iterations; i++)
knn(ref, ref_nb, query, query_nb, dim, k, dist);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsed_time, start, stop);
printf(" done in %f s for %d iterations (%f s by iteration)\n", elapsed_time/1000, iterations, elapsed_time/(iterations*1000));
// Destroy cuda event object and free memory
cudaEventDestroy(start);
cudaEventDestroy(stop);
free(dist);
free(query);
free(ref);
return 1;
}
我尝试使用以下命令从终端运行它:
g++ -c Main.cpp -m32
nvcc -c CudaFunctions.cu -lcuda -D_CRT_SECURE_NO_DEPRECATE
nvcc -o mytest Main.o CudaFunctions.o
但是得到以下错误:
Undefined symbols for architecture i386:
"cuda_function(int, int)", referenced from:
_main in Main.o
"_cuInit", referenced from:
knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
"_cuCtxCreate_v2", referenced from:
knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
"_cuMemGetInfo_v2", referenced from:
knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
"_cuCtxDetach", referenced from:
knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
我不知道这是否与#include语句或头文件有关。我有很多想法尝试。
答案 0 :(得分:1)
第一个未定义的符号
"cuda_function(int, int)", referenced from:
_main in Main.o
是由CudaFunctions.cu
定义cuda_function2
而不是cuda_function
引起的。在CudaFunctions.cu
或Main.cpp
中更正名称。
其余的未定义符号是由于没有正确链接libcuda.dylib
引起的,因为那是符号存在的地方。尝试将-lcuda
参数移动到第二个nvcc
命令行,即实际将程序链接在一起的命令行。更好的是,尝试完全省略-lcuda
参数,因为没有必要。