0

我在将数据从 Intel Xeon Phi 协处理器传输到主机 CPU 时遇到问题。我尝试使用卸载模型来实现计算。在我的计算开始时,我将所有数据传输到协处理器(一个数组)。计算后,我只想将此数组的一部分传输到主机处理器,但结果出现以下错误:

卸载错误:数据传输(base=0x75654640,size=7896016)不是现有分配的子集(base=0x75654640,size=4512008)

以下是部分源代码:

array_Dc = _mm_malloc(...);
...
#pragma offload target(mic : micZero) \
 in(array_Dc : length(size) alloc_if(0) free_if(0)) \
 out(array[micBegin : micEnd] : alloc_if(0) free_if(0) 
{
   //...
}

在这种情况下,这个数组的大小 = 564001,micBegin = 423001,micEnd = 564001。我需要传输数据,因为它们被 CPU 使用。什么是问题?如何解决?

4

1 回答 1

2

它抱怨您正在尝试传输数组的一部分,而没有告诉它应该在协处理器上分配多少数组。它想知道您是只想分配要传输的数组的一部分,还是想分配更大的一块,甚至整个数组。您可以做几件事。一种是使用 alloc 选项。在 16.0 编译器的文档中,您可以在Allocating Memory for Parts of Arrays中找到说明。基本上,您的 out 选项将变为 - 假设您要为协处理器上的完整数组分配空间:

#pragma offload ........... out(array[micBegin : micEnd] : alloc[0 : 564001])

另一种选择是将数组分配与数据传输分开,例如使用 offload_transfer。在 16.0 编译器的文档中,您可以在About Asynchronous Data Transfer找到说明。

最后一件事 - 在 C/C++ 中,micEnd 的值将是元素的数量,与 Fortran 不同,它将是最后一个元素的索引。作为一个旧的 Fortran 程序员,这让我很难受,但事实就是如此。

于 2015-12-14T18:44:42.217 回答