Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何构建包含cuda函数和c++;模板函数_C++_Stl_Cuda - Fatal编程技术网

C++ 如何构建包含cuda函数和c++;模板函数

C++ 如何构建包含cuda函数和c++;模板函数,c++,stl,cuda,C++,Stl,Cuda,代码如下: #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

代码如下:

#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;
}
如果我将该文件重命名为.cpp并重新生成,则可以编译代码,但会出现“error LNK2001:unresolved external symbol threadIdx”的链接错误。 那么如何构建代码?

这可能是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;
}
模板void InsertValueNode(std::list&ValueList,T NewValue)
{
auto itCurVal=ValueList.begin();
while(itCurVal!=ValueList.end())
{
如果(新值<(*itCurVal))
打破
itCurVal++;
}
std::insert_迭代器itNewNode(ValueList,itCurVal);
*itNewNode=NewValue;
}
使用nvcc引导编译时,只要使用
-std=c++11
选项即可。您可能想考虑向NVIDIA提交一份bug报告

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;
}