gpt4 book ai didi

C++/Cuda 模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:19 24 4
gpt4 key购买 nike

我在使用以下代码使用 CUDA 和 VS 2015 时遇到问题:

主.cu

#include <chrono>
#include <thread>
#include <cuda_runtime.h>
#include "foo.h"

int main(int argc, char **argv)
{
foo<uchar4> f(make_uchar4(1, 2, 3, 4));
f.start();
std::this_thread::sleep_for(std::chrono::seconds(2));
f.stop();
return 0;
}

foo.h

#include <thread>

template<typename T>
class foo
{
public:

foo(T value);

void start();

void run();

void stop();

private:
T _value;
std::thread _thread;
bool _run;
};

#endif //__FOO_H__

foo.cu

#include "foo.h"

#include <iostream>
#include <cuda_runtime.h>

template<typename T>
foo<T>::foo(T value)
{
_run = false;
_value = value;
}

template<typename T>
void foo<T>::start()
{
_run = true;
_thread = std::thread(&foo<T>::run, this);
}

template<typename T>
void foo<T>::run()
{
while (_run)
{
std::cout << "YOLO ! " << _value.x << std::endl;
}
}

template<typename T>
void foo<T>::stop()
{
_run = false;
if (_thread.joinable()) _thread.join();
}

template class foo<uchar1>;
template class foo<uchar2>;
template class foo<uchar4>;

这个示例非常简单。它创建一个对象 foo然后调用方法 start启动一个将显示“YOLO”的线程。主线程休眠 2 秒,然后停止 YOLO 线程。就这样 !当我尝试使用 Cuda 8.0 和 Visual Studio 2015 构建它时出现此错误:C2292: 'foo<uchar1>': best case inheritance representation: 'virtual_inheritance' declared but 'single_inheritance' required它出现在我用 template class foo<uchar1>; 声明的所有不同类型中

我没有解释这个错误。我尝试使用 g++ 5.4 和 CUDA 8.0 在 Debian 上构建它,它运行完美!以同样的方式,我删除了所有对 CUDA 的引用,并且仅使用 c++ 和 VS 2015,它再次起作用。

有人知道为什么它不起作用吗?

最佳答案

您的问题有两种解决方法:将 foo 类的所有内容放在头文件中或声明您的类

class __single_inheritance foo

这是盲目尝试,但我认为编译器正在尝试使用一种优化技术(正如我在评论中指出的那样),该技术受到不完整类型和 VC++ 处理实例化/翻译单元的方式的阻碍。

关于C++/Cuda 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com