如何实现最高传输速率

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件英才网软件行业驰名招聘网站

如何实现最高传输速率

选择编程模式,如何实现最高传输速率

概述

下面的简单示例展示了如何测量最优的数据传输速率。该示例介绍了如何使用_mm_malloc() 和

_mm_free() 来替代malloc() 和free(),以便分配和释放在4K 边界上对齐的数据,这对于向英特尔®至强融核™协处理器的DMA传输是最理想的。该示例未提供实际数据速率,只是展示实现高效数据传输所使用的技术。

主题

必须在确保4K 对齐的情况下分配数据以获得最佳的DMA性能。DMA在通过PCIe 向英特尔®至强融核™协处理器传输数据时可实现较高的效率。

在定时循环之前使用_mm_malloc() 在MIC 分配数据。在循环内部传输数据时,请使用free_if(0) alloc_if(0)。下面提供了一个简单的代码版本。

如何运行代码:

**************

-bash-4.1$ icc -offload-build bwtest.c

-bash-4.1$ ./a.out -h

使用:

./a.out -h -a -d -n

-bash-4.1$ ./a.out

Bandwidth test. Buffer alignment: 4096. DeviceID: 0. Number of iterations: 20.

Size(Bytes) Send(Bytes/sec) Receive(Bytes/sec)

-bash-4.1$

软件英才网软件行业驰名招聘网站****************

[p:/] cat bwtest.c

#include

#include

#include

#include

#include

/* buffer alignment */

static int align = 4096;

/* device id */

static int device = 0;

/* number of interations in benchmarking loop */

static int niters = 20;

/* CPU buffer */

__declspec(target(mic))

static char* buf;

软件英才网软件行业驰名招聘网站/* buffer sizes */

static const int bufsizes[] =

{

4096,

8192,

16384,

32768,

65536,

131072,

262144,

524288,

1048576,

2097152,

4194304,

8388608,

16777216,

33554432,

67108864,

134217728,

268435456,

536870912,

软件英才网软件行业驰名招聘网站0

};

static void parse_options(int argc, char** argv)

{

int opt;

while ((opt = getopt(argc, argv, "ha:d:n:")) != -1) {

switch (opt) {

case 'a':

align = atoi(optarg);

if (align <= 0 || align & (align-1) != 0) {

printf("Invalid alignment %d\n", align);

exit(1);

}

break;

case 'd':

device = atoi(optarg);

if (device < 0) {

printf("Invalid device ID %d\n", device);

软件英才网软件行业驰名招聘网站exit(1);

}

break;

case 'n':

niters = atoi(optarg);

if (niters <= 0) {

printf("Invalid number of iterations %d\n", niters);

exit(1);

}

break;

default:

printf("Usage:\n\t%s -h -a -d -n

\n", argv[0]);

exit(0);

}

}

}

static inline double get_cpu_time()

软件英才网软件行业驰名招聘网站{

struct timeval tv;

if (gettimeofday(&tv, 0)) {

printf("gettimeofday returned error\n");

abort();

}

return _sec + _usec/1e6;

}

int main(int argc, char **argv)

{

int i, j;

double send;

double receive;

parse_options(argc, argv);

printf("Bandwidth test. Buffer alignment: %d. DeviceID: %d. Number of iterations: %d.\n\n",

align, device, niters);

printf("%20s %20s %20s\n",

相关文档
最新文档