0

我正在尝试编写一些简单的程序来学习 NVidia CUDA/Thrust。我是个菜鸟。我想要做的是使用带有自定义谓词的 find_if 。目前我的谓词只是在所有内容上都返回 true,所以我正在尝试获取所有输入。我想最终搜索字符串,在其中我用一些字符串 X 初始化函子,然后让 GPU 找到所有匹配的字符串。

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

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

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

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

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

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

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;
}
4

1 回答 1

2

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

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

您最终会得到在 GPU 上没有意义的指针值。

在 C++ 中,要在 CPU 上运行,您将使用std::string存储字符串。所以这将是一个std::vector<std::string>. 由于没有设备实现string,因此事情变得复杂,因此您无法将它们复制到 GPU。

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

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

此外,以这种方式将包含许多项目的向量移动到设备内存非常低效,因为您对这些项目执行的每个分配都会device_vector导致在后台执行从主机到设备内存的单独副本。相反,填充 ahost_vector然后将 分配host_vectordevice_vector。然后,只执行从主机到设备内存的单个副本。

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

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

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

使用结果创建 a 后device_vector,只需将其分配给 ahost_vector即可在一次操作中将其移动到主机内存。

thrust::host_vector<char*> H = D;
于 2012-05-05T04:04:17.100 回答