Связывание CUDA и C ++: неопределенные символы для архитектуры i386 - PullRequest
1 голос
/ 03 октября 2011

Я очень старался, но безуспешно.Я надеюсь, что кто-то может помочь мне заставить это работать.У меня есть два исходных файла.

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 операторы или заголовочные файлы.У меня остались идеи, чтобы попробовать.

1 Ответ

1 голос
/ 04 октября 2011

Первый неопределенный символ

"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 полностью, потому что в этом нет необходимости.

...