2017-03-12 20 views
2

我写一个自定义的TensorFlow运算需要能够读取,以便决定如何继续OpKernel计算()实现中的张量的电流值。本征不支持的的TensorMap template(使用的tensorflow::TTypes的typedef)提供了函数调用操作,当运算正在主机上运行的我可以使用的多个重载。实际上,“Adding a New Op”教程示例代码使用函数调用操作符重载将值分配给张量。从张量读取设备不可知的方式?

的问题是,当运算是在GPU上运行,调用段错误的函数调用操作符重载的结果。这是因为函数调用操作重载解引用一个m_data构件指针,但是当张量驻留在GPU这是一种设备指针。此外,与this other question,我不认为我可以使用HostMemory(),因为张是暂时的,所使用的GPU代码。

我目前调用cudaMemcpy()将设备内存复制到主机,但我想使用与设备无关的方式从设备内存读取设备是否为Eigen::ThreadPoolDeviceEigen::GpuDevice或其他 - 因为我会那么能够使用相同的特征码,但是针对每个支持的设备进行编译(“仿函数”方法)。

我注意到TensorBase :: eval()方法,但我不能确定这是否是我所期待的。

回答

0

每个本征*设备类型的具有memcpyDeviceToHost()成员。调用memcpy()的DefaultDeviceThreadPoolDevice的实现。对于GpuDevice该实现调用cudaMemcpyAsync()。

一个问题是,SyclDevice的memcpyDeviceToHost()具有不同的特征和不同的语义;而DefaultDeviceThreadPoolDevice,并且GpuDevice有:

void memcpyDeviceToHost(void* dst, const void* src, size_t n) const 

..这复制n字节SyclDevice有:

void memcpyDeviceToHost(void* dst, const T* src, size_t n) const 

..这副本nT对象

为了避免潜在的问题,它可能是最好的静态投src设备指针const void*这样,当设备类型为SyclDevice,你会得到一个编译错误,精确定位需要进行专门的不同语义代码SyclDevice :: memcpyDeviceToHost()。