2016-08-10 9 views
0

Я начинаю новый проект, который включает CUDA, и я хотел бы использовать Glade (v3) для графического интерфейса.Использование Glade с компилятором CUDA (Nvidia Eclipse Nsight) -> какие настройки компоновщика NVCC?

Я пытаюсь реализовать проект Glade в базовом проекте шаблона CUDA, а вот мой код до сих пор:

#include <iostream> 
#include <numeric> 
#include <stdlib.h> 
#include <gtk/gtk.h> 

static void CheckCudaErrorAux (const char *, unsigned, const char *, cudaError_t); 
#define CUDA_CHECK_RETURN(value) CheckCudaErrorAux(__FILE__,__LINE__, #value, value) 

/** 
* CUDA kernel that computes reciprocal values for a given vector 
*/ 
__global__ void reciprocalKernel(float *data, unsigned vectorSize) { 
    unsigned idx = blockIdx.x*blockDim.x+threadIdx.x; 
    if (idx < vectorSize) 
     data[idx] = 1.0/data[idx]; 
} 

/** 
* Host function that copies the data and launches the work on GPU 
*/ 
float *gpuReciprocal(float *data, unsigned size) 
{ 
    float *rc = new float[size]; 
    float *gpuData; 

    CUDA_CHECK_RETURN(cudaMalloc((void **)&gpuData, sizeof(float)*size)); 
    CUDA_CHECK_RETURN(cudaMemcpy(gpuData, data, sizeof(float)*size, cudaMemcpyHostToDevice)); 

    static const int BLOCK_SIZE = 256; 
    const int blockCount = (size+BLOCK_SIZE-1)/BLOCK_SIZE; 
    reciprocalKernel<<<blockCount, BLOCK_SIZE>>> (gpuData, size); 

    CUDA_CHECK_RETURN(cudaMemcpy(rc, gpuData, sizeof(float)*size, cudaMemcpyDeviceToHost)); 
    CUDA_CHECK_RETURN(cudaFree(gpuData)); 
    return rc; 
} 

float *cpuReciprocal(float *data, unsigned size) 
{ 
    float *rc = new float[size]; 
    for (unsigned cnt = 0; cnt < size; ++cnt) rc[cnt] = 1.0/data[cnt]; 
    return rc; 
} 


void initialize(float *data, unsigned size) 
{ 
    for (unsigned i = 0; i < size; ++i) 
     data[i] = .5*(i+1); 
} 

int main(int argc, char *argv[]) 
{ 
    static const int WORK_SIZE = 65530; 
    float *data = new float[WORK_SIZE]; 

    initialize (data, WORK_SIZE); 

    GtkBuilder  *builder; 
    GtkWidget  *window; 

    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "GladeTest01.glade", NULL); 

    window = GTK_WIDGET(gtk_builder_get_object(builder, "applicationwindow1")); 
    gtk_builder_connect_signals(builder, NULL); 

    g_object_unref(builder); 

    gtk_widget_show(window); 
    gtk_main(); 

    /* 
    float *recCpu = cpuReciprocal(data, WORK_SIZE); 
    float *recGpu = gpuReciprocal(data, WORK_SIZE); 
    float cpuSum = std::accumulate (recCpu, recCpu+WORK_SIZE, 0.0); 
    float gpuSum = std::accumulate (recGpu, recGpu+WORK_SIZE, 0.0); 

    /* Verify the results *//* 
    std::cout<<"gpuSum = "<<gpuSum<< " cpuSum = " <<cpuSum<<std::endl; 

    /* Free memory *//* 
    delete[] data; 
    delete[] recCpu; 
    delete[] recGpu; 
*/ 
    return 0; 
} 

// called when window is closed 
void on_QuitApp() 
{ 
    gtk_main_quit(); 
} 

При компиляции, я не могу понять, почему я получил эти ошибки:

/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:72: undefined reference to `gtk_init' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:74: undefined reference to `gtk_builder_new' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:75: undefined reference to `gtk_builder_add_from_file' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:77: undefined reference to `gtk_widget_get_type' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:77: undefined reference to `gtk_builder_get_object' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:77: undefined reference to `g_type_check_instance_cast' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:78: undefined reference to `gtk_builder_connect_signals' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:80: undefined reference to `g_object_unref' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:82: undefined reference to `gtk_widget_show' 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:83: undefined reference to `gtk_main' 
./src/GladeTest.o: In function `on_QuitApp()': 
/home/fabio/AppTests/GladeTest01/Debug/../src/GladeTest.cu:105: undefined reference to `gtk_main_quit' 
collect2: error: ld returned 1 exit status 
make: *** [GladeTest] Error 1 

Как и все, кажется, определяется в gtk.h и все остальные включает в себя в нем ... Что я здесь отсутствует?

Может ли кто-нибудь дать мне какие-то указания или сказать мне, что я делаю неправильно?

Edit: Здесь команды компиляции используются:

Invoking: NVCC Compiler 
/usr/local/cuda-7.5/bin/nvcc -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/glib-2.0 -G -g -O3 -gencode arch=compute_52,code=sm_52 -m64 -odir "src" -M -o "src/GladeTest.d" "../src/GladeTest.cu" 
/usr/local/cuda-7.5/bin/nvcc -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/glib-2.0 -G -g -O3 --compile --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -m64 -x cu -o "src/GladeTest.o" "../src/GladeTest.cu" 
Finished building: ../src/GladeTest.cu 

Building target: GladeTest 
Invoking: NVCC Linker 
/usr/local/cuda-7.5/bin/nvcc --cudart static --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -m64 -link -o "GladeTest" ./src/GladeTest.o  

Если я правильно понял ответы, все -I варианты должны быть в линкере вызова NVCC, а не в команде NVCC компилятора?

Редактировать 2: Вот один из многих вариантов, которые я пробовал. С той же результаты каждый раз:

Invoking: NVCC Compiler 
/usr/local/cuda-7.5/bin/nvcc -I/usr/include/gtk-3.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/atk-1.0 -G -g -O3 -gencode arch=compute_52,code=sm_52 -m64 -odir "src" -M -o "src/GladeTest.d" "../src/GladeTest.cu" 
/usr/local/cuda-7.5/bin/nvcc -I/usr/include/gtk-3.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/atk-1.0 -G -g -O3 --compile --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -m64 -x cu -o "src/GladeTest.o" "../src/GladeTest.cu" 
Finished building: ../src/GladeTest.cu 

Building target: GladeTest 
Invoking: NVCC Linker 
/usr/local/cuda-7.5/bin/nvcc --cudart static -L/usr/include/gtk-3.0 -L/usr/include/glib-2.0 -L/usr/lib/x86_64-linux-gnu/glib-2.0/include -L/usr/include/pango-1.0 -L/usr/include/cairo -L/usr/include/gdk-pixbuf-2.0 -L/usr/include/atk-1.0 -lGL -lGLU -lglut --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -m64 -link -o "GladeTest" ./src/GladeTest.o 
+0

Пожалуйста, покажите свои команды компиляции. – andlabs

+0

Это ошибка связи, а не ошибка компиляции. Вы должны * связать * соответствующие библиотеки GTK – talonmies

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http: // stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Drop

ответ

2

Важно понимать, что источником ошибок, которые вы видите, это соединение, а не компиляции, а причина будет то, что вы не связывающая необходимые библиотеки GTK.

я был в состоянии произвести исполняемый файл из кода вы публикуемые (с крошечной модификацией) против GTK2 в системе Ubuntu, как это:

$ nvcc -arch=sm_52 -Xcompiler="`pkg-config --cflags gtk+-2.0`" cuda_glade.cu `pkg-config --libs gtk+-2.0` 

$ ldd a.out 
    linux-vdso.so.1 => (0x00007ffdf351c000) 
    libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007f85eece0000) 
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f85eea8e000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f85ee886000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f85ee668000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f85ee464000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f85ee15f000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f85edd9a000) 
    libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007f85edae7000) 
    libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f85ed8e2000) 
    libpangocairo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f85ed6d5000) 
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f85ed3a0000) 
    libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f85ed199000) 
    libatk-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f85ecf77000) 
    libcairo.so.2 => /usr/lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f85ecc6c000) 
    libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f85eca4a000) 
    libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f85ec6d7000) 
    libpangoft2-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f85ec4c2000) 
    libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f85ec274000) 
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f85ec038000) 
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f85ebd30000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f85eba29000) 
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f85eb821000) 
    /lib64/ld-linux-x86-64.so.2 (0x000055d54fa62000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f85eb60a000) 
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f85eb400000) 
    libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f85eb1fd000) 
    libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f85eafec000) 
    libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f85eade2000) 
    libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f85eabd8000) 
    libXcomposite.so.1 => /usr/lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f85ea9d4000) 
    libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f85ea7d1000) 
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f85ea5bf000) 
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f85ea31b000) 
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f85ea0fc000) 
    libpixman-1.so.0 => /usr/lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f85e9e53000) 
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f85e9c2d000) 
    libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f85e9a2a000) 
    libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f85e9820000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f85e9607000) 
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f85e93e3000) 
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f85e91c8000) 
    libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f85e8f73000) 
    libthai.so.0 => /usr/lib/x86_64-linux-gnu/libthai.so.0 (0x00007f85e8d69000) 
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f85e8b3f000) 
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f85e8901000) 
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f85e86fc000) 
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f85e84f6000) 
    libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f85e82cf000) 
    libdatrie.so.1 => /usr/lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f85e80c8000) 

Здесь я использую pkg-config получить необходимые флаги компилятора и линкера и просто передавая их непосредственно nvcc. Вы можете создать их вручную, если у вас нет доступа к pkg-config. Важным моментом является установка библиотечных зависимостей после вашего собственного кода. Компонент GNU считывает зависимости слева направо, и если вы укажете библиотеку до кода, который зависит от нее, компоновщик просто отбросит библиотеку и вызовет ошибку связывания.


EDIT: Для того, чтобы сделать это в Nsight Затмения издание

Добавьте pkg-config команды в свойствах проекта как для компилятора и компоновщика фаз с использованием $(shell pkg-config ...): nvcc compile flags nvcc linker flags

Создание проекта с ваш код дает этот журнал построения:

make all 
Building file: ../src/glade_cuda.cu 
Invoking: NVCC Compiler 
/opt/cuda-7.5/bin/nvcc -O3 -Xcompiler -fPIC -Xcompiler -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/harfbuzz -gencode arch=compute_52,code=sm_52 -odir "src" -M -o "src/glade_cuda.d" "../src/glade_cuda.cu" 
/opt/cuda-7.5/bin/nvcc -O3 -Xcompiler -fPIC -Xcompiler -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/harfbuzz --compile --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -x cu -o "src/glade_cuda.o" "../src/glade_cuda.cu" 
Finished building: ../src/glade_cuda.cu 

Building target: libGTK test 
Invoking: NVCC Linker 
/opt/cuda-7.5/bin/nvcc --cudart static -shared -Xlinker -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lglib-2.0 -lfreetype --relocatable-device-code=false -gencode arch=compute_52,code=compute_52 -gencode arch=compute_52,code=sm_52 -link -o "libGTK test" ./src/glade_cuda.o 
Finished building target: libGTK test 


12:57:43 Build Finished (took 3s.963ms) 
+0

Спасибо, я постараюсь выяснить это как можно скорее. – FabioB

+0

Я только что редактировал свой вопрос и добавил команды nvcc, используемые при сборке. Я постараюсь выяснить правильные варианты. – FabioB

+0

Ну, я потратил 2 часа на то, чтобы все, что я мог себе представить, в настройках как компилятора NVCC, так и компоновщика NVCC, изменения порядка вариантов, относительных и абсолютных путей к библиотекам .... Я попробую спросить на форумах Nvidia dev. – FabioB