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

Cuda NVidia矢量和迭代器推力编程-基本问题,cuda,nvidia,thrust,Cuda,Nvidia,Thrust,为了学习NVidia CUDA/推力,我正在尝试编写一些简单的程序。我是个彻头彻尾的笨蛋。我要做的是将find_if与自定义谓词一起使用。目前,我的谓词在所有内容上都返回true,因此我尝试获取所有输入。我希望最终搜索字符串,用字符串X初始化函子,然后允许GPU查找所有匹配的字符串 我对这里的几点感到困惑 我尝试填充一个设备向量,其中充满指向字符串的指针,然后对MemCmp谓词运行它 首先,设备_向量是否“知道”将我的字符串从主内存复制到GPU内存,还是只是复制一个指针值 其次,在第“count

为了学习NVidia CUDA/推力,我正在尝试编写一些简单的程序。我是个彻头彻尾的笨蛋。我要做的是将find_if与自定义谓词一起使用。目前,我的谓词在所有内容上都返回true,因此我尝试获取所有输入。我希望最终搜索字符串,用字符串X初始化函子,然后允许GPU查找所有匹配的字符串

我对这里的几点感到困惑

我尝试填充一个设备向量,其中充满指向字符串的指针,然后对MemCmp谓词运行它

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

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

最后,我获取小程序结果的方法正确吗?我是否要使用推力::copy将内存复制到一个host_向量中,并且像末尾那样的循环是否足以查看结果

如有任何建议,我们将不胜感激。谢谢

乔丹

struct MemCmp
{
__主机设备__
布尔运算符()(字符*数据)
{
bool rv=假;
rv=真;
返回rv;
}
};
....
//我初始化一个设备向量,然后将指针从主存复制到设备向量中。
推力:设备向量d输入向量(itemCount);

for(int i=0;i
find_if
不是查找所有匹配字符串的好函数。它只查找匹配的第一个元素。请查看
copy_if

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

您将得到在GPU上没有意义的指针值

<>在C++中,在CPU上运行,你将使用<代码> STD::String 来存储字符串。因此,它将是一个<代码> STD::vector < /代码>。事实上,没有“代码>字符串”的设备实现,所以不能将这些拷贝拷贝到GPU。

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

这样,你学习CUDA/Trand的简单操作可能不会那么简单。我认为你需要一个C++类来封装一个固定大小的字符数组,并为必要的操作符实现设备函数。 此外,以这种方式将包含许多项的向量移动到设备内存中是非常低效的,因为您对

device\u向量
所做的每次分配都会导致在后台执行从主机到设备内存的单独副本。相反,请填充
host\u向量
,然后将
host\u向量
分配给
de>然后,只执行从主机到设备内存的单个拷贝

第二,在“count=d_inputVector.end()-iter”行,它返回一个12,表示迭代器中的项数,这是find_if的结果。这是否错误?如果我尝试iter,则-d_inputVector.begin()返回零,这不会得到任何结果

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

最后,我获取小程序结果的方法正确吗?我是否要使用推力::copy将内存复制到一个host_向量中,并且像最后一个循环那样的循环是否足以查看结果

使用结果创建
设备_向量
后,只需将其分配给
主机_向量
,即可在一次操作中将其移动到主机内存中

thrust::host_vector<char*> H = D;
推力::主机向量H=D;

谢谢你的回复,罗杰。还有一个问题,像字符数组一样复制一段内存的正确方法是什么?推力::设备_vector=char[1000]原谅我的C++,已经有一段时间了。我给答案加了一段,但是它仍然不适合你所需要的。我建议把这个部分分解成一个单独的问题。也就是说,如何使用推力来处理字符串向量(比如找到所有匹配字符串)。这里有一些非常有见识的人应该能够回答。
thrust::host_vector<char*> H = D;