ITPub博客

首页 > Linux操作系统 > Linux操作系统 > CUDA的模板类里不要重载operator=

CUDA的模板类里不要重载operator=

原创 Linux操作系统 作者:洛欣 时间:2009-11-17 09:06:58 0 删除 编辑

苍天啊,这么一个问题折磨了我一天半。本来我有一个模板类:

template 
struct ALIGN16 foo
{
    T x[n];
    foo() {}
    foo(const foo& other) {...}

    void perator=(const foo& other) {...}
};

这个类在C++下没有任何问题,但在CUDA下却报出诡异的错误:

### Assertion failure at line 724 of ../../be/cg/NVISA/exp_loadstore.cxx:
### Compiler Error in file test_carray_gpu.cpp3.i during Code_Expansion phase:
### lda but not addr used?

感觉上,像是nvcc在deduce模板参数时出了问题,无法code expansion了。经过我坚持不懈的折腾,终于被我找到这个stupid的问题,那就是,不能重载operator=,因为我们的拷贝构造函数做了同样的事情,nvcc无法知道该调用那个函数,也可能是,在nvcc里,对象的拷贝和赋值只需要做到内存块的拷贝就可以了。总之,在你想重载operator=的时候,先考虑下,在GPU里,是否内存的直接拷贝就满足了这个需求呢?是否需要重载这个操作符呢?

唉,俺痛苦的一天,还好,没有无功而返。

原文

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22785983/viewspace-619793/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-11-12

  • 博文量
    111
  • 访问量
    273836