2016-07-13 9 views
1

私はthisに似たクラスベースのC++コードを持ち、クラスの__device__メソッドを宣言するための構造に従っています。私もProject Properties-> CUDA C/C++ -> Common -> Generate Relocatable Device Codeに行ってYESに変更しましたが、hereは、リンクオプションが変更される必要があり、VSオプションでこれを行う方法をthis informationから理解できないと言います。リンクするにはどうしたらいいですか?CUDA 8.0リロケータブルデバイスコードを使用する場合のVisual Studio 2012リンカオプション

関連していないとして、オリジナルのポストで**削除VCスタジオの設定**

テストコードです:

kernel.cu

#include "Test.cuh" 

// CUDA kernel 
__global__ void myKernel(Test* t) { 

// Call device function 
t->device_function(); 
} 


// Entry point 
int main() 
{ 

// Create object (host and device copies) 
Test* t = new Test(); 
Test* t_dev = NULL; 
cudaMalloc(&t_dev, sizeof(Test)); 

// Copy object 
cudaMemcpy(t_dev,t,sizeof(Test),cudaMemcpyHostToDevice); 

// Call kernel passing pointer to device copy of the object 
myKernel<<<1,1>>>(t_dev); 

} 

Test.cuh

class Test 
{ 
public: 
Test(void); 
~Test(void); 

__device__ void device_function(); 
}; 

Test.cu

#include "Test.cuh" 
Test::Test(void){} 
Test::~Test(void){} 

__device__ void Test::device_function() { 

// Do something 

} 

EDIT

私はそれが適切にデバイスの実装をコンパイルすることはないかもしれないと思うと、コンパイルログを追加します。

1> C:\C++ Projects\CudaTest\CudaTest>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir Release -maxrregcount=0 --machine 32 --compile  -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -o Release\kernel.cu.obj "C:\C++ Projects\CudaTest\CudaTest\kernel.cu" -clean 
1> kernel.cu 
1> Compiling CUDA source file kernel.cu... 
1> 
1> C:\C++ Projects\CudaTest\CudaTest>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2012 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin" -rdc=true -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir Release -maxrregcount=0 --machine 32 --compile -cudart static  -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -o Release\kernel.cu.obj "C:\C++ Projects\CudaTest\CudaTest\kernel.cu" 
1> kernel.cu 
1> Test.cu 
1> 
1> C:\C++ Projects\CudaTest\CudaTest>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -dlink -o Release\CudaTest.device-link.obj -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\Win32" cudart.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib -gencode=arch=compute_20,code=sm_20 --machine 32 Release\kernel.cu.obj 
1> CUDALINK : nvlink error : Undefined reference to '_ZN4Test15device_functionEv' in 'Release/kernel.cu.obj'` 
+0

'Test.cpp'はコンパイルできません。実際のコンパイルログを貼り付けることができますか?あなたが投稿したVCからのカット&ペーストは、何がうまくいかないのかを理解する上で全く役に立たない。 – talonmies

+0

これはCUDAコンパイラでコンパイルされた 'kernel.cu'だけで、' Test'クラスではないので、デバイスコードが正しく埋め込まれていませんか? - 申し訳ありませんが、あなたのことを見たことなしにこのコメントを書きました。それから私は正しい線に沿って考えていると思う。 – CodingLumis

+0

@talonmies私はログを投稿しました。 – CodingLumis

答えて

2

OK、CUDAプラグインとのVSは、それが、異なっCUDA C/C++ source/header fileC/C++ source/headerをカタログし、あなたは単に私が何であったかである*.cu*.cppの名前を変更して別のに変換することができないという二つの異なるItem Type秒を持っているので、もともとクラスをクラスにリンクできるオブジェクトにコンパイルするように強制しようとしました。

私はソリューションエクスプローラで右クリックして、それぞれTest.cuTest.cuhとまったく同じソースコードを含むファイルTest.cppTest.h付加を再してAdd Item -> CUDA source/header fileに行くと、今ではkernel.cuTest.cu/h 2にオブジェクトを構築しますリンクステージでの両方が供給され、問題は解消されます。

正しい方向に私を指すのを助けるための@タロモンミーのおかげです。

EDIT

私はコメントで述べたようにあなたはまだ彼らは今、異なるItem TypeであることをVSを伝えるために必要がある場合、あなたは単にファイルの名前を変更することができます。もともと私は*.vcxprojファイルを編集して、名前を変更したファイルをコンパイルするようにCUDAコンパイラに指示しました。これは、このような<ItemGroup>定義を変更することで行われます

<ItemGroup> 
    <CudaCompile Include="main.cu" /> 
    <CudaCompile Include="RenamedSrcFile.cu" /> 
</ItemGroup> 

<ItemGroup> 
    <ClInclude Include="RenamedHeaderFile.cuh" /> 
    <ClInclude Include="myOtherHeader.h" /> 
</ItemGroup> 

この行<CudaCompile Include="RenamedSrcFile.cu" />が鍵とCUDAのコンパイル段階でこのファイルを含んでいます。通常のC++ファイルはグループ<ClCompile>の下に表示されますが、この例では指定されていません。

Robertさんのコメントで示されているように、*.vcxprojファイルを直接編集する必要はありません。これは、VSで選択したオプションに基づいてVSがファイルを管理するためです。前述のようにファイルを(再)追加することによって、このスワップはVSによって処理されます。

EDIT2

は、コメント欄でドロップの提案を1として、あなたはソリューションエクスプローラでファイルを右クリックしてファイルを再追加し Properties->Generalの下であなたがする Item Typeを選択することができずに、このスワップを達成することができますa CUDA C/C++ C/C++ではなく正しくカタログ化してください。

+0

ソースファイルの推定コンパイラが期待通りでない場合は、ソースファイル(または選択したファイルの束)を右クリックしてPropertiesに移動し、C++コンパイラとCUDAコンパイラを選択します(適切な "type" )。この場合、ヘッダーファイルは直接コンパイルされないので心配する必要はありません(Visual Studioでは別の "タイプ"もあります)。 – Drop

+0

ありがとう@Drop私の答えに追加します。 – CodingLumis

関連する問題