我在将数据从英特尔至强融核协处理器传输到主机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使用。有什么问题?如何解决?
答案 0 :(得分: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程序员,这让我感到困难,但就是这样。