2017-04-27 74 views
0

的代码如下代码:如何构建包含CUDA功能和C++模板函数

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#include <list> 
#include <iterator> 
#include <stdio.h> 

template<class T> void InsertValueNode(std::list<T> &ValueList,T NewValue) 
{ 
    std::list<T>::iterator itCurVal = ValueList.begin(); 
    while(itCurVal != ValueList.end()) 
    { 
     if(NewValue < (*itCurVal)) 
      break; 
     itCurVal++; 
    } 
    std::insert_iterator< std::list<T> > itNewNode(ValueList, itCurVal); 
    *itNewNode = NewValue; 
} 

__global__ void addKernel(int *c, const int *a, const int *b) 
{ 
    int i = threadIdx.x; 
    c[i] = a[i] + b[i]; 
} 

//to simplify the problem, just imply an empty main function 
int main() 
{ 
    return 0; 
} 

的上式的代码是在Visual Studio 2010中的项目一.CU文件。问题是,编译时编译器不能识别STL迭代器的定义:

error : identifier "itNumerical" is undefined 
error : identifier "itCurVal" is undefined 
error : expected a ";" 

如果我重命名文件的.cpp和重建,该代码可以编译,但是链接错误“错误LNK2001:无法解析的外部符号threadIdx “发生。 那么如何构建代码呢?

回答

0

可能是CUDA C++前端/解析器在标准库模板上的一个限制。我可以用CUDA 8和gcc 4.8.5重现它。

作为解决办法,这似乎工作:

template<class T> void InsertValueNode(std::list<T> &ValueList,T NewValue) 
{ 
    auto itCurVal = ValueList.begin(); 
    while(itCurVal != ValueList.end()) 
    { 
     if(NewValue < (*itCurVal)) 
      break; 
     itCurVal++; 
    } 
    std::insert_iterator< std::list<T> > itNewNode(ValueList, itCurVal); 
    *itNewNode = NewValue; 
} 

使用NVCC时只要-std=c++11选项用于引导编译。您可能想考虑使用NVIDIA提交错误报告