簡體   English   中英

類的CUDA推力:: device_vector | 錯誤

[英]CUDA thrust::device_vector of class | error

我是CUDA和推力庫的新手。 我一直在瀏覽有關我的問題的許多示例和問題,但是,我無法轉移解決方案。

我有一個Cell類,其中應包含Tree的向量(另一個類)。

這是我的Cell.h

#pragma once

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/generate.h>
#include <thrust/reduce.h>
#include <thrust/functional.h>




#include "Tree.h"

class Cell {
    int idx;
    float xmid, ymid;
    float dx, dy;
    int nTrees;
    thrust::host_vector<Tree> trees;
//  thrust::device_vector<Tree> trees;         <-- this is what I want
public:
     Cell();
    Cell(int, float, float, float, float, int);
    void set(int, float, float, float, float, int);
    void add(float, float, float);
    void add(float);
    void add();
    virtual ~Cell();
    void print();
    void copyToDev();
};

這是我的Tree.h

#pragma once
#include <iostream>
#include <cstdlib>
using namespace std;



class Tree {

    float x, y, r;
    int idx;
public:
     Tree();
     Tree(float, float, float, int);
     void set(float, float, float, int);
     virtual ~Tree();
     void print();
};

這兩個類都在擴展名為.cu的文件中實現。 現在我要在main.cu中初始化一個Cell C 鑒於以上代碼,我可以編譯代碼(使用以前未使用過的Visual Studio 2013,所以對我來說可能是另一個問題)。 但是,如果我沒記錯的話,使用host_vector不會使用我的GPU。 我想要的是改用device_vector

但是,如果我使用device_vector而不是host_vector編譯代碼, device_vector出現以下錯誤

    1>------ Build started: Project: WTM, Configuration: Debug Win32 ------
1>  Cell.cu
1>c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\system\detail\error_category.inl(102): warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h(168) : see declaration of 'strerror'
1>c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\system\cuda\detail\bulk\detail\pointer_traits.hpp(55): warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning)
1>c:\users\thomas\documents\visual studio 2013\projects\wtm\wtm\cell.cu(40): warning C4018: '<' : signed/unsigned mismatch
1>c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\system\cuda\detail\for_each.inl(84): error C2027: use of undefined type 'thrust::detail::STATIC_ASSERTION_FAILURE<false>'
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\for_each.inl(71) : see reference to function template instantiation 'RandomAccessIterator thrust::system::cuda::detail::for_each_n<thrust::system::cuda::detail::tag,InputIterator,Size,UnaryFunction>(thrust::system::cuda::detail::execution_policy<thrust::system::cuda::detail::tag> &,RandomAccessIterator,Size,UnaryFunction)' being compiled
1>          with
1>          [
1>              RandomAccessIterator=thrust::device_ptr<Tree>
1>  ,            InputIterator=thrust::device_ptr<Tree>
1>  ,            Size=int
1>  ,            UnaryFunction=thrust::detail::allocator_traits_detail::gozer
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\allocator\destroy_range.inl(136) : see reference to function template instantiation 'InputIterator thrust::for_each_n<DerivedPolicy,Pointer,Size,thrust::detail::allocator_traits_detail::gozer>(const thrust::detail::execution_policy_base<DerivedPolicy> &,InputIterator,Size,UnaryFunction)' being compiled
1>          with
1>          [
1>              InputIterator=thrust::device_ptr<Tree>
1>  ,            DerivedPolicy=thrust::system::cuda::detail::tag
1>  ,            Pointer=thrust::device_ptr<Tree>
1>  ,            Size=int
1>  ,            UnaryFunction=thrust::detail::allocator_traits_detail::gozer
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\allocator\destroy_range.inl(157) : see reference to function template instantiation 'void thrust::detail::allocator_traits_detail::destroy_range<Allocator,Pointer,Size>(Allocator &,Pointer,Size)' being compiled
1>          with
1>          [
1>              Allocator=thrust::device_malloc_allocator<Tree>
1>  ,            Pointer=thrust::device_ptr<Tree>
1>  ,            Size=int
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\contiguous_storage.inl(256) : see reference to function template instantiation 'void thrust::detail::destroy_range<thrust::device_malloc_allocator<T>,Base,int>(Allocator &,Pointer,Size)' being compiled
1>          with
1>          [
1>              T=Tree
1>  ,            Base=thrust::device_ptr<Tree>
1>  ,            Allocator=thrust::device_malloc_allocator<Tree>
1>  ,            Pointer=thrust::device_ptr<Tree>
1>  ,            Size=int
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\contiguous_storage.inl(255) : while compiling class template member function 'void thrust::detail::contiguous_storage<T,Alloc>::destroy(thrust::detail::normal_iterator<thrust::device_ptr<T>>,thrust::detail::normal_iterator<thrust::device_ptr<T>>)'
1>          with
1>          [
1>              T=Tree
1>  ,            Alloc=thrust::device_malloc_allocator<Tree>
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\vector_base.inl(474) : see reference to function template instantiation 'void thrust::detail::contiguous_storage<T,Alloc>::destroy(thrust::detail::normal_iterator<thrust::device_ptr<T>>,thrust::detail::normal_iterator<thrust::device_ptr<T>>)' being compiled
1>          with
1>          [
1>              T=Tree
1>  ,            Alloc=thrust::device_malloc_allocator<Tree>
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\detail\vector_base.inl(44) : while compiling class template member function 'thrust::detail::vector_base<T,Alloc>::vector_base(void)'
1>          with
1>          [
1>              T=Tree
1>  ,            Alloc=thrust::device_malloc_allocator<Tree>
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\device_vector.h(67) : see reference to function template instantiation 'thrust::detail::vector_base<T,Alloc>::vector_base(void)' being compiled
1>          with
1>          [
1>              T=Tree
1>  ,            Alloc=thrust::device_malloc_allocator<Tree>
1>          ]
1>          c:\program files\nvidia gpu computing toolkit\cuda\v7.0\include\thrust\device_vector.h(54) : see reference to class template instantiation 'thrust::detail::vector_base<T,Alloc>' being compiled
1>          with
1>          [
1>              T=Tree
1>  ,            Alloc=thrust::device_malloc_allocator<Tree>
1>          ]
1>          c:\users\thomas\documents\visual studio 2013\projects\wtm\wtm\cell.h(27) : see reference to class template instantiation 'thrust::device_vector<Tree,thrust::device_malloc_allocator<T>>' being compiled
1>          with
1>          [
1>              T=Tree
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我真的不確定如何解決這個問題。 也許有人可以指導我解決這個問題。 先感謝您!

編輯

正如所指出的,我忘記了main ,這是下面的代碼, .cu文件中的.cu

#include "Cell.h"


int main(void)
{


    Cell D(0, 0.5, 0.5, 1, 1);

    D.print();  
    return 0;
}

減少到最小的一部分。 如果缺少更多信息,請告訴我。

如果按照錯誤消息的提示來查看帶有thrust::system::cuda::detail::for_each_n定義的文件,則會發現以下注釋( 鏈接到github ):

// we're attempting to launch a kernel, assert we're compiling with nvcc
// ========================================================================
// X Note to the user: If you've found this line due to a compiler error, X
// X you need to compile your code using nvcc, rather than g++ or cl.exe  X
// ========================================================================

確保您確實使用nvcc來編譯程序,而不僅僅是嘗試將推力包含在使用Visual Studio的cl進行編譯的普通c++項目中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM