Как связать источники и заголовки (cpp vs cu) - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь собрать dll для внешней программы, которая ранее работала нормально.Но .... По какой-то причине, если я попытаюсь скомпилировать следующее в Visual Studio 2008 Pro Sp1 (64-разрядная версия win7)

интенсивностиRescale << >> (src_img_in_data, maxValue, minValue, 1);

Я получу сообщение об ошибке:

1>..\inte.cpp(37) : error C2059: syntax error : '<'

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

In "inte.cpp "у меня есть:

void inte( DM::Image img, float maxValue, float minValue )
{
#include "inte.h"
#include "Source1.h"
// Some stuff to get the pointer (float * img_data) //WORKS

intensityRescalec(img_data, maxValue, minValue,1);
}

В" inte.h "у меня просто есть:

void inte(DM::Image, float, float );

Затем я сделал .cu файл" Source1.cu ":

#include "Source1.h"

__global__ void intensityRescale(float *image, float maxValu, float minValu, int typ)
{
const int tid = (blockIdx.y*MNBLOCKX + blockIdx.x)*blockDim.x + threadIdx.x;

    if(tid < MNX0*MNY0*MNZ0)
{   
    if(typ>0)       
        image[tid] = (image[tid] - minValu)/(maxValu-minValu);
    else
        image[tid] = image[tid]*(maxValu-minValu) + minValu;

}
}
 void intensityRescalec(float *mimage, float mmaxValue, float mminValue,int mType)
{

dim3 Mnblocks;
Mnblocks.x = MNBLOCKX;
Mnblocks.y =  ((1 + (MNX0*MNY0*MNZ0 - 1)/MNTHREAD_PER_BLOCK) - 1) / MNBLOCKX + 1; 

intensityRescale<<<Mnblocks, MNTHREAD_PER_BLOCK>>>(mimage, mmaxValue,mminValue,     1);
}

А затем в "Source1.h":

#ifndef _Source1_h_INCLUDED__
#define _Source1_h_INCLUDED__


#include "cuda.h"
#include <cutil_inline.h>
#include <cublas.h>

#define MNBLOCKX 1024
#define MNX0 1024
#define MNY0 1024
#define MNZ0 1
#define MNBLOCKX 1024
#define MNTHREAD_PER_BLOCK 256
void intensityRescalec(float * da, float d, float f , int g);
void intensityRescale(float *image, float maxValu, float minValu, int typ);
#endif

Теперь, если у меня есть пользовательское правило сборки, cuda64.rules выдает следующее:

1>inte.obj : error LNK2019: unresolved external symbol "void __cdecl          intensityRescalec(float *,float,float,int)" (?intensityRescalec@@YAXPEAMMMH@Z) referenced  in function "void __cdecl inte(class Gatan_Image *,float,float)"  (?inte@@YAXPEAVGatan_Image@@MM@Z)
1>C:\ProgramData\Gatan\DMSDK\ITK\buildcmake\Release\ITK.dll : fatal error LNK1120: 1   unresolved externals

Безправило:

1>C:\ProgramData\Gatan\DMSDK\ITK\buildcmake\Release\ITK.dll : fatal error LNK1169: one or more multiply defined symbols found

Я не использую переменные где-либо еще, так что это значит?

Также я должен построить это в многопоточном режиме DLL (/ MD), так какнекоторые другие библиотеки зависят от этого.Я не нашел cutil64D.lib в CUDA 4. Это устарело или я что-то пропустил.

Я скачал все наборы инструментов, драйверы, cuda SDK, buildrules и следовал инструкциям в нем.Также попробовал CUDA VS Wizard.

Я потратил на это дни!НИЧЕГО НЕ РАБОТАЕТ !!!

HELP!

Раньше мне удавалось встроить проект fft из CUFFT в dll, так что ...... Но это не затрагивало ядра.

Огромное спасибо за любые отзывы!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Это сработало!
Когда я генерирую проект с помощью Cmake, Платформа Target machine для Source1.cu по какой-то причине даже x86 думала, что все остальное - x64.Как я мог изменить это поведение?Также библиотека времени выполнения была [/ MT], хотя у меня есть [/ MD] везде.Так что, если у кого-то еще возникают такие же проблемы:

1) Щелкните правой кнопкой мыши проект для Правил пользовательской сборки и выберите Правило сборки API CUDA Runtime (v4.0)

2) Затем щелкните правой кнопкой мыши нафайл .cu для свойств и в API среды выполнения CUDA-> Host измените целевой компьютер и библиотеку времени выполнения

3) Для меня я также изменил код на следующий

Я изменил«Source1.h» - «Source1.cuh»:

#ifndef _Source1_h_
#define _Source1_h_

void intensityRescalec(float *,float,float);

#endif

И «Source1.cu»:

#include "Source1.cuh"

#ifndef _cuda_h_INCLUDED__
#define _cuda_h_INCLUDED__
#include <cuda.h>
#endif

#ifndef _cutil_inline_h_INCLUDED__
#define _cutil_inline_h_INCLUDED__
#include <cutil_inline.h>
#endif

#ifndef _cublas_h_INCLUDED__
#define _cublas_h_INCLUDED__
#include <cublas.h>
#endif


#define MNBLOCKX 1024
#define MNX0 1024
#define MNY0 1024
#define MNZ0 1
#define MNBLOCKX 1024
#define MNTHREAD_PER_BLOCK 256
dim3 Mnblocks;


__global__ void intensityRescale(float *image, float maxValu, float minValu)
{
const int tid = (blockIdx.y*MNBLOCKX + blockIdx.x)*blockDim.x + threadIdx.x;

    if(tid < MNX0*MNY0*MNZ0)
{   
    //if(typ>0)     
        image[tid] = (image[tid] - minValu)/(maxValu-minValu);
    //else
        //image[tid] = image[tid]*(maxValu-minValu) + minValu;

}
}

void intensityRescalec(float *mimage, float mmaxValue, float mminValue)
{

Mnblocks.x = MNBLOCKX;
Mnblocks.y =  ((1 + (MNX0*MNY0*MNZ0 - 1)/MNTHREAD_PER_BLOCK) - 1) / MNBLOCKX + 1; 

intensityRescale<<<Mnblocks, MNTHREAD_PER_BLOCK>>>(mimage, mmaxValue, mminValue);
}

В «Inte.h» у меня просто есть:

void inte( DM_ImageToken, float, float );

И в "Inte.cpp" все то же самое ожидаемо, конечно, для #include "Source1.cuh" ​​

0 голосов
/ 13 декабря 2011

Ваш "ИнтенсивностьRescale << >> (src_img_in_data, maxValue, minValue, 1);"ошибка вызвана попыткой вызвать ядро ​​CUDA из файла CPP (CPP компилируется компилятором VisualStudio, который не имеет «понимания» синтаксиса CUDA).Вам нужен еще один слой в коде, чтобы вы могли представить функцию из файла CUDA в файл CPP с C / CPP-совместимым интерфейсом (тот, который не использует синтаксис CUDA).Похоже, вы делаете большую ошибку с вашим кодом.Ошибки компоновщика отчасти связаны с тем, что вы включаете файлы в определение функции.Держите включения в верхней части ваших файлов кода.Убедитесь, что у вас правильно настроен компилятор и т. Д., Собрав и запустив некоторые демонстрации CUDA SDK из источника SDK.Затем посмотрите, можете ли вы создать проект с нуля, используя часть исходного кода SDK.Это гарантирует, что вы знаете, какие настройки необходимы, не беспокоясь о коде (только настройки проекта).Как только это сработает, прочитайте исходный код SDK и посмотрите, как они планируют свои проекты (то есть, какой источник входит в какие файлы).

...