2015-10-06 49 views
0

我有一个std::vector不同尺寸的矩阵,我将计算每个矩阵的平方。我有两个解决方案:推力与立方体的性能

1 /将所有矩阵平坦化,并将它们作为巨大的平面数组(float *)存储在设备中,并使用该矩阵中每个矩阵的开始和结束索引,并以cublas为例做平方。

2将矩阵存储在thrust::device_vector<float *>中,并使用thrust::for_each来排列它们。

很明显,第二种解决方案提供了更多可读代码,但会影响性能吗?

+1

您发布的代码对我来说编译得很好。你*必须*用nvcc在一个扩展名为.cu的文件中编译推荐的GPU代码。除此之外,我不明白你的问题是 – talonmies

+0

谢谢!我现在知道推力码必须在.cu文件中,并且必须用nvcc编译。我编辑了这个问题,使其更清晰。 –

回答

2

我认为这是(现在)只是question you already asked的重复。

假设您想要做的元素操作就像每个元素的平方一样简单,那么两种情况下的性能或效率应该没有什么区别。

这是因为这样的操作会受内存限制,这意味着它的性能将受(GPU)内存带宽的限制。因此,两种实现将具有大致相同的限制器,并且性能大致相同。

注意,在您的两个提案,但这些数据最终需要得到有效的以同样的方式“扁平化”(推力操作不能在一个典型的或简单的方式构造上thrust::device_vector<float *>操作)

如果例如,您已经拥有了推力和CUBLAS的组合,那么您可以使用适合您的任何方法。另一方面,如果你的模块只使用了CUBLAS,并且你可以使用CUBLAS或推力实现你的操作,我不确定我是否会为这一操作注入推力。但这只是一个意见问题。