Ошибки CUDA и Linker - PullRequest
       17

Ошибки CUDA и Linker

0 голосов
/ 12 марта 2011

Этот вопрос может быть аналогичен Ошибка компоновщика 2005 и 1169 (несколько определенных символов) при использовании функций CUDA __device__ (должна быть встроена по умолчанию) , но не совсем. Я получаю несколько ошибок LNK2005 при попытке построить проект (используя код, который, как было показано, работает в другом месте) на VS2010. Я в конце своего ума.

Например, у меня есть следующие три файла: transposeGPU.h, transposeGPU.cu и transposeCUDA.cu. transposeGPU.h можно суммировать следующим образом:

void transposeGPU(float *d_dst, size_t dst_pitch,
    float *d_src, size_t src_pitch,
    unsigned int width, unsigned int height);

То есть одна декларация без включений. Определение этой функции содержится в transposeGPU.cu, который можно обобщить следующим образом:

#include <stdio.h>
#include "../transposeGPU.h"
#include "../helper_funcs.h"

#include "transposeCUDA.cu"

void
transposeGPU(float *d_dst, size_t dst_pitch,
    float *d_src, size_t src_pitch,
    unsigned int width, unsigned int height)
{
    // execution configuration parameters
    dim3 threads(16, 16);
    dim3 grid(iDivUp(width, 16), iDivUp(height, 16));
    size_t shared_mem_size =
        (threads.x * threads.y + (threads.y - 1)) * sizeof(float);

    transposeCUDA<<<grid, threads, shared_mem_size>>>(
        d_dst, dst_pitch / sizeof(float),
        d_src, src_pitch / sizeof(float),
        width, height);
}

, т.е. tranposeGPU.cu включает в себя файл заголовка и transposeCUDA.cu, помимо определения transposeGPU() и вызова transposeCUDA(), последний найден в transposeCUDA.cu. Теперь transposeCUDA.cu определяет функцию как ожидалось:

#include "common_kernel.h"

__global__ void
transposeCUDA(
    float *g_dst, size_t s_dst_pitch,
    const float *g_src, size_t s_src_pitch,
    unsigned int img_width, unsigned int img_height)
{
// several lines of code...
}

Все выглядит по порядку, но я все равно получаю error LNK2005: "void __cdecl __device_stub__Z13transposeCUDAPfjPKfjjj(float *,unsigned int,float const *,unsigned int,unsigned int,unsigned int)" (?__device_stub__Z13transposeCUDAPfjPKfjjj@@YAXPAMIPBMIII@Z) already defined in transposeCUDA.obj в transposeGPU.obj.

Это и еще около двадцати подобных ошибок компоновщика. Зачем? Там нет очевидного переопределения происходит. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Существует переопределение, если вы компилируете оба transposeCUDA.cu и transposeGPU.cu, так как определение появляется в обеих единицах перевода.Вы не должны #include transposeCUDA.cu и применять nvcc к этому файлу.

0 голосов
/ 12 марта 2011

Для пояснения: __device__ функции встроены (по крайней мере, в пре-Ферми), но __global__ нет - в конце концов, вы не можете встроить код GPU в исполняемую функцию вашего CPU.Глобальные функции могут получить свой адрес, единственное отличие состоит в том, что адрес указывает на память GPU (аналогично тому, как обычные указатели на данные, хранящиеся на GPU, выглядят как простые указатели).

Как сказал Уильям Перселл, если вы компилируетеВаша глобальная функция дважды, вы получаете две функции с одинаковым определением, что приводит к ошибке компоновщика.

...