将文件读取到共享内存

时间:2016-05-11 12:58:38

标签: c xeon-phi cilk

我正在阅读一个二进制文件,我希望通过Cilk和共享内存直接卸载到Xeon Phi。

由于我们每次都在读取相当多的数据和二进制数据,因此首选的选项是使用fread。

因此,如果我做一个非常简单的例子,那就像这样

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

_Cilk_shared uint8_t* _Cilk_shared buf;

int main(int argc, char **argv) {
  printf("Argv is %s\n", argv[1]);
  FILE* infile = fopen(argv[1], "rb");
  buf = (_Cilk_shared uint8_t*) _Offload_shared_malloc(2073600);
  int len = fread(buf, 1, 2073600, infile);
  if(ferror(infile)) {
    perror("ferror");
  }
  printf("Len is %d and first value of buf is %d\n", len, *buf);
  return 0;
}

该示例与实际代码相比非常简单,但足以说明行为。

此代码将返回

ferror: Bad address
Len is 0 and first value of buf is 0

然而,如果我们为fgets切换fread(不太适合读取二进制数据,特别是返回值),事情很有效。

那就是我们切换fgets((char *) buf, 2073600, infile);然后从我们得到的打印件中删除len

first value of buf is 46

哪个适合我们需要的东西,我可以在一个以buf作为参数的函数上运行_Offload_cilk并对其进行处理。

我有什么东西丢失或者是不支持吗?我试图从互联网上的英特尔和其他网站上找到尽可能多的信息,但我遗憾地无法做到。

---- ---- EDIT

经过对此研究的进一步研究,似乎在共享内存上运行fread,其值大于524287(524287,确切地说是19位)fread从上面获取错误。在524287或更低的位置工作,你可以运行任意数量的fread并读取所有数据。

我无法在任何地方找到任何理由。

2 个答案:

答案 0 :(得分:1)

你可以尝试在fread电话之前插入这样的东西吗?

memset(buf, 0, 2073600); // after including string.h

这个技巧对我有用,但我不知道为什么(懒惰分配?)。

仅供参考,您也可以在this forum上发布MIC问题。

答案 1 :(得分:1)

我没有PHI,因此无法确定这是否会产生影响 - 但是fread有自己的缓冲,虽然这可能会被转换为这种类型的readind,但我不明白为什么你会经历使用fread的开销,而不仅仅是使用open&amp; read的低级调用,比如

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdint.h>

_Cilk_shared uint8_t* _Cilk_shared buf;

int main(int argc, char **argv) {
  printf("Argv is %s\n", argv[1]);
  int infile = open(argv[1], O_RDONLY); // should test if open ok, but skip to make code similar to OP's
  int len, pos =0, size = 2073600;
  buf = (_Cilk_shared uint8_t*) _Offload_shared_malloc(size);
  do { 
      buf[pos]=0; // force the address to be mapped to process memory before read
      len = read(infile, &buf[pos], size);
      if(len < 0) {
         perror("error");
         break;
      }
      pos += len; // move position forward in cases where we have no read the entire data in first read.
      size -= len;
  } while (size > 0);
  printf("Len is %d (%d) and first value of buf is %d\n", len, pos, *buf);
  return 0;
}
阅读&amp; write应该使用分配的共享内存,而不会出现您遇到的问题。