1

所以我必须处理一些结构数据,我必须以一种奇怪的方式为 MPI_Send/Recv 压缩这些数据。

没有办法轻松地将它转换为指向我想要操作的已知类型的指针,然后沿着索引(因为我已经将结构压缩到连续数据中,不能假设任何关于对齐的事情),所以我必须去通过它用指针算术。问题是,为了与 MPI 保持一致,此数据以 void* 形式给出,并且 void* 上的指针运算是非法的。

我的问题主要是文体问题:有没有比转换为 char* 然后做我的指针算术更好的方法?采用 void*、转换为 char*、对其进行处理,然后转换回 void* 时的效率考虑是什么?我无法想象指针转换会非常昂贵。

非常感谢。

4

3 回答 3

3

指针转换是完全免费的。去做吧。

具有类型的指针完全是语言级别的概念。当您深入到硬件级别时,指针只是一个恰好用作内存地址的整数。

我认为,在转换指针时,你必须小心严格的别名,但char *它被定义为安全的。

[好的,在某些情况下,在某些架构上,指针具有“只是整数”之外的特殊处理,但您可能会忽略这些。还有一些 ABI,其中不同的指针类型不同的(例如 FDPIC),但同样是其他人的问题。]

于 2013-07-30T16:29:13.897 回答
0

您的解决方案是合理的。很多时候我做过这样的事情:

void handle_raw(void* data) {
    // Use a uint8_t so pointer arithmetic is at a byte-level.
    uint8_t* p = data;    
    uint16_t value;

    // Read a 2-byte value at an arbitrary offset.
    value = *(uint16_t*)(p + 0x42);

    // Write a 2-byte value at an arbitrary offset.
    *(uint32_t*)(p + 0x12) = 0xDEADBEEF;
}

当然,您应该使用常量作为偏移量,并执行适当的边界检查。

于 2013-07-30T16:32:22.080 回答
0

您需要自己打包缓冲区有什么特别的原因吗?你真的在 MPI 操作之前压缩了连续缓冲区中的数据吗?如果是这样,您的压缩加上传输时间必须低于简单地进行传输。如果是这样,那么我可以将其视为很好的理由。

如果您实际上是专门为 MPI 操作打包在一个连续的缓冲区中,那么解决问题的更好方法是自己停止打包数据,而是使用MPI 派生的数据类型

您可以使用“ MPI 派生数据类型示例”之类的内容进行网络搜索,并获得比我可以在此处简要写的更好的解释。

于 2013-08-01T12:01:57.153 回答