用矢量和迭代器进行NVidia推力编程 - 基本问题

时间:2012-05-05 03:07:53

标签: cuda nvidia thrust

我正在尝试编写一些简单的东西来学习NVidia CUDA / Thrust。我是一个总菜鸟。我要做的是使用带有自定义谓词的find_if。我现在的谓词只是在所有内容上都返回true,所以我试图获得所有输入。我想最终搜索字符串,我用一些字符串X初始化仿函数然后允许GPU找到匹配的所有字符串。

我对这里的几点感到困惑。

我尝试填充一个装满指向我的字符串的指针的device_vector,然后针对我的MemCmp谓词运行它。

首先,device_vector是否“知道”将我的字符串从主内存复制到GPU内存,还是只复制一个指针值?

其次,在“count = d_inputVector.end() - iter”这一行;“它返回一个12,它是我的迭代器中的项目数,它是find_if的结果。这不对吗?如果我尝试它 - d_inputVector.begin()返回零,这不会得到我的任何地方。

最后,我的方法是否能使我的小程序结果正确?我是否使用thrust :: copy将内存复制到host_vector中,并且像一个循环那样的循环是否足以查看结果?

非常感谢任何建议。谢谢,

MJ

struct MemCmp
{
    __host__ __device__
    bool operator()(char *data)
    {
        bool rv = false;
        rv = true;

        return rv;
    }
};

....

// I initialize a device_vector and then copy pointers from main memory into the device_vector.
thrust::device_vector<char*> d_inputVector( itemCount );

for( int i=0; i<itemCount; i++ ){
    d_inputVector[i] = inputData[i];
}

thrust::device_vector<char*>::iterator iter;
iter = thrust::find_if( d_inputVector.begin(), d_inputVector.end(), MemCmp() );

    // this is the count that I think is wrong. 
count = d_inputVector.end() - iter; 

thrust::host_vector<char*> results( count );

thrust::copy( d_inputVector.begin(), iter, results.begin() );

for( thrust::host_vector<char *>::iterator it = results.begin(); it != results.end(); it++ ){
    char* foo = *it;
}

1 个答案:

答案 0 :(得分:2)

find_if不是查找匹配所有字符串的好函数。它只是找到匹配的第一个第一个元素。看看copy_if

  

首先,device_vector是否“知道”将我的字符串从主内存复制到GPU内存,还是只复制一个指针值?

你最终会得到GPU上无意义的指针值。

在C ++中,要在CPU上运行,您可以使用std::string来存储字符串。所以这将是std::vector<std::string>。事实上,string没有设备实现,因此无法将这些内容复制到GPU中。

此外,许多STL算法(我猜它与thrust相同)要求向量中的元素对象具有工作副本构造函数和赋值运算符。编译器提供基本类型的那些,但不提供char数组。

因此,您学习CUDA / Trust的简单练习可能不会那么简单。我认为你需要一个C ++类来封装一个固定大小的字符数组,并为必要的运算符实现设备函数。

此外,以这种方式将具有多个项目的向量移动到设备内存是非常低效的,因为您对device_vector执行的每个分配都会导致从主机到设备内存的单独副本在后台执行。而是填充host_vector,然后将host_vector分配给device_vector。然后,只执行从主机到设备存储器的单个副本。

  

其次,在“count = d_inputVector.end() - iter”这一行;“它返回一个12,它是我的迭代器中的项目数,它是find_if的结果。这不对吗?如果我尝试它 - d_inputVector.begin()返回零,这不会得到我的任何地方。

表达式应该是count = d_inputVector.begin() - iter;,它应该返回0,因为向量中的第一个元素与find匹配。

  

最后,我的方法是否能使我的小程序结果正确?我是否使用thrust :: copy将内存复制到host_vector中,并且像一个循环那样的循环是否足以查看结果?

在您的结果中创建device_vector之后,只需将其分配给host_vector即可在一次操作中将其移至主机内存。

thrust::host_vector<char*> H = D;