如何实现最高传输速率
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
-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
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",