如何构建包含CUDA功能和C 模板功能的代码

How to build code containing cuda function and c++ template function

本文关键字:功能 代码 CUDA 何构建 构建 包含      更新时间:2023-10-16

代码如下:

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

Aboving代码在Visual Studio 2010项目中的.cu文件中。问题是编译器在编译时无法识别STL迭代器的定义:

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

如果我将文件重命名为.cpp和Rebuild,则可以编译代码,但是会出现"错误lnk2001:未解决的外部符号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;
}

使用NVCC进行汇编时,只要使用-std=c++11选项。您可能想考虑使用NVIDIA

提交错误报告