У меня есть устройство , которое определено в заголовочном файле. Причина, по которой он находится в заголовочном файле, заключается в том, что он используется ядром global , которое должно находиться в заголовочном файле, поскольку это ядро шаблона.
Когда этот заголовочный файл включен в 2 или более файлов .cu, я получаю ошибку LNK2005 во время компоновки:
FooDevice.cu.obj: ошибка LNK2005: "int
__cdecl getCurThreadIdx (void) "(? getCurThreadIdx @@ YAHXZ) уже определено
в Main.cu.obj
Почему эта ошибка вызвана? Как это исправить?
Вот пример кода для выдачи вышеуказанной ошибки:
FooDevice.h:
#ifndef FOO_DEVICE_H
#define FOO_DEVICE_H
__device__ int getCurThreadIdx()
{
return ( ( blockIdx.x * blockDim.x ) + threadIdx.x );
}
template< typename T >
__global__ void fooKernel( const T* inArr, int num, T* outArr )
{
const int threadNum = ( gridDim.x * blockDim.x );
for ( int idx = getCurThreadIdx(); idx < num; idx += threadNum )
outArr[ idx ] = inArr[ idx ];
return;
}
__global__ void fooKernel2( const int* inArr, int num, int* outArr );
#endif // FOO_DEVICE_H
FooDevice.cu:
#include "FooDevice.h"
// One other kernel that uses getCurThreadIdx()
__global__ void fooKernel2( const int* inArr, int num, int* outArr )
{
const int threadNum = ( gridDim.x * blockDim.x );
for ( int idx = getCurThreadIdx(); idx < num; idx += threadNum )
outArr[ idx ] = inArr[ idx ];
return;
}
Main.cu:
#include "FooDevice.h"
int main()
{
int num = 10;
int* dInArr = NULL;
int* dOutArr = NULL;
const int arrSize = num * sizeof( *dInArr );
cudaMalloc( &dInArr, arrSize );
cudaMalloc( &dOutArr, arrSize );
// Using template kernel
fooKernel<<< 10, 10 >>>( dInArr, num, dOutArr );
return 0;
}