用UPC读取文件

时间:2012-07-06 02:45:39

标签: parallel-processing hpc upc

我开始学习UPC,我有以下代码来读取文件:

upc_file_t *fileIn;
int n;
fileIn = upc_all_fopen("input_small", UPC_RDONLY | UPC_INDIVIDUAL_FP , 0, NULL);
upc_all_fread_local(fileIn, &n, sizeof(int), 1, UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC);

upc_barrier;
printf("%d\n", n);

upc_all_fclose(fileIn);

但是,输出(n的值)总是808651319,这意味着出了问题,我找不到它是什么。我输入的文件的第一行是'7',因此printf的结果应为7 ...

知道为什么会这样吗?

提前致谢!

1 个答案:

答案 0 :(得分:4)

UPC并行I / O库执行无格式(二进制)输入/输出,而不是像标准C库中(f)printf(3) / (f)scanf(3)那样格式化的输入/输出。并行I / O由于其固有属性(如可变长度记录)而无法处理文本文件。

upc_all_fread_local(fileIn, &n, sizeof(int), 1, UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC)

的行为类似于以下对标准C库函数的调用,用于从文件中进行无格式读取:

fread(&n, sizeof(int), 1, fh)

您只是将文件中的sizeof(int)字节的1个元素(大多数平台上为4个字节)读入n的地址。您以十六进制获得的808651319的数字是0x30330A37。在像x86 / x64这样的小端系统上,它以0x37 0x0A 0x33 0x30(反向字节顺序)存储在内存和磁盘上。这些是字符串7\n30的前4个字节的ASCII码(\n或LF是换行/换行符号)所以我猜你的input_small文件看起来像:

7
30...
...

您应该使用fwrite(3)而不是使用(f)printf(3)或您选择的文本编辑器,以二进制格式准备输入数据。