我正在尝试编写一些简单的东西来学习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;
}
答案 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;