Parallel processing 用UPC读取文件
我开始学习UPC,我有以下代码来读取文件:Parallel processing 用UPC读取文件,parallel-processing,hpc,upc,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_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
知道为什么会这样吗
提前谢谢 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)
您只需将文件中的1个sizeof(int)
字节(大多数平台上为4字节)读取到n
的地址中。您得到的十六进制数808651319
是0x30330A37
。在x86/x64这样的小端系统上,它以0x37 0x0A 0x33 0x30
的形式存储在内存和磁盘上(反向字节顺序)。这些是字符串7\n30
的前4个字节的ASCII码(\n
或LF是换行符/新行符),因此我猜您的输入文件看起来像:
7
30...
...
您应该使用fwrite(3)
以二进制格式准备输入数据,而不是使用(f)printf(3)
或您选择的文本编辑器