3

我有两个变量:

boost::array my_boost_array_variable_1<float, 3>;
boost::array my_boost_array_variable_2<float, 3>;

现在我想调用具有以下签名的 C 函数:

int MPI_Allreduce ( void *sendbuf, void *recvbuf, ...);

我想将我的特定元素的地址my_boost_array_variable_1作为 my_boost_array_variable_2MPI_Allreduce 的第一个和第二个参数传递:

MPI_Allreduce(&my_boost_array_variable_1[2],
              &my_boost_array_variable_2[2], ...

或者我应该这样做:

MPI_Allreduce(my_boost_array_variable_1.c_array() + 2,
              my_boost_array_variable_2.c_array() + 2, ...

更新:C 函数需要一个连续的数据块,从 void *sendbuf 开始。这里的问题是这两个调用在这方面是否正确。&my_boost_array_variable_1[2] 是否指向与 my_boost_array_variable_1.c_array() + 2 相同的位置?这些调用是否等效?

4

3 回答 3

2

对我来说,第一个比第二个更清楚。但实际上我认为他们是平等的。

于 2012-11-29T10:01:50.360 回答
1

根据http://www.boost.org/doc/libs/1_52_0/doc/html/boost/array.html任何版本都不会抛出。(无法评论我的小名声:-))

于 2012-11-30T00:42:07.363 回答
0

哪个更快取决于系统,您可以自己查看汇编代码。

第一种方法更安全,因为如果您尝试处理不合法的索引,它会抛出异常。

第二种方法通常更快,因为您只有一个取消引用。

于 2012-11-29T10:53:08.310 回答