我想覆盖低级CUDA设备内存分配器(实现为thrust :: system :: cuda :: detail :: malloc()),以便在调用时使用自定义分配器而不是直接调用cudaMalloc()主机(CPU)线程 .
这可能吗?如果是这样,是否可以使用Thrust“执行策略”机制来执行此操作?我试过这样的模型:
struct eptCGA : thrust::system::cuda::detail::execution_policy<eptCGA>
{
};
/// overload the Thrust malloc() template function implementation
template<typename eptCGA> __host__ __device__ void* malloc( eptCGA, size_t n )
{
#ifndef __CUDA_ARCH__
return MyMalloc( n ); /* (called from a host thread) */
#else
return NULL; /* (called from a device GPU thread) */
#endif
}
/* called as follows, for example */
eptCGA epCGA;
thrust::remove_if( epCGA, ... );
这有效 . 但是Thrust的其他组件调用了低级malloc实现,似乎没有使用“执行策略”机制 . 例如,
thrust::device_vector<UINT64> MyDeviceVector( ... );
不会使用“执行策略”参数公开重载 . 相反,malloc()在15个嵌套函数调用的底部被调用,使用一个执行策略,该策略看似硬连线到该调用堆栈中间的某个Thrust函数中 .
有人可以澄清我采取的方法是不正确的,并解释一个可行的实施应该做什么?
1 回答
这对我有用 . 您可以创建自定义执行策略和分配器,它们一次性使用您的自定义malloc:
这是我系统上的输出:
你甚至可以变得更加漂亮,并使用
thrust::pointer<T,Tag>
包装器将my_policy
合并到自定义的pointer
类型中 . 这会产生使用my_policy
而不是CUDA执行策略标记my_vector
的迭代器的效果 . 这样,您就不必为每个算法调用提供显式执行策略(如调用thrust::remove
所示) . 相反,Thrust只会通过查看my_vector
迭代器的类型来知道使用自定义执行策略 .