您的位置:首页 > 运维架构

关于offload中nocopy时的误区

2015-09-24 22:49 495 查看
在使用Intel的MIC卡的过程中,最根本的一个工具就是offload,通过offload,可以轻松的让代码跑在MIC上,这当然会涉及一个问题:CPU端的数据如何加载到MIC的内存中的?

offload的内存管理是通过哈希表来实现,CPU端的数据基地址作为哈希表的key关联MIC的内存,从而实现MIC端的内存的动态开辟(alloc_if(1)free_if(0))。

我们可能会遇到一种情况:只有在MIC端在用到某组数据,这是nocopy就是个很好的工具。但是大家千万不要用未初始化的指针去offload。

例1.

unsigned int *ptr1, *ptr2;
#pragma offload target(mic)\
nocopy(ptr1:length(len1), alloc_if(1)free_if(0))\
nocopy(ptr2:length(len2), alloc_if(1)free_if(0))
{
printf("pointer 1 address = %x\n", ptr1);
printf("pointer 2 address = %x\n", ptr2);
}


大家尝试下,可以发下,在MIC端打印出来的ptr1和ptr2的地址是一样的!一样的!一样的!如果不注意这一点的话,用起来就只有是哭的份了,得不到正确的结果。

为了规避这个问题,就需要我们自己在MIC端手动开辟内存来用了。在退出MIC时,再释放掉就可以了。具体方法如下:

unsigned int *ptr1, *ptr2;
#pragma offload target(mic)\
nocopy(ptr1:length(0), alloc_if(1)free_if(0))\
nocopy(ptr2:length(0), alloc_if(1)free_if(0))
{
ptr1 = new unsigned int [len1];
ptr2 = new unsigned int [len2];
}


伪代码:

void main()
{
unsigned int *ptr1, *ptr2;
printf("In CPU pointer 1 address = %x\n", ptr1);
printf("In CPU pointer 2 address = %x\n", ptr2);

#pragma offload target(mic)\
nocopy(ptr1:length(0), alloc_if(1)free_if(0))\
nocopy(ptr2:length(0), alloc_if(1)free_if(0))
{
printf("Before malloc memmory ,in MIC pointer 1 address = %x\n", ptr1);

ptr1 = new unsigned int [len1];
ptr2 = new unsigned int [len2];

printf("After malloc memmory ,in MIC pointer 1 address = %x\n", ptr1);
printf("After malloc memmory ,in MIC pointer 2 address = %x\n", ptr2);
}

// MIC端程序结束时,释放内存
#pragma offload target(mic)\
nocopy(ptr1,ptr2)
{
delete []ptr1;
delete []ptr2;
}
}


参考来源:

【1】https://software.intel.com/en-us/blogs/2013/03/27/behind-the-scenes-offload-memory-management-on-the-intel-xeon-phi-coprocessor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  英特尔 MIC offload nocopy