如何使用 CUDA Thrust 执行策略覆盖 Thrust 的低级设备内存分配器

2023-12-23

我想重写低级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 函数之一。

有人可以澄清我所采取的方法是如何不正确的,并解释一个可行的实施应该做什么?


这是对我有用的东西。您可以一次性创建使用自定义 malloc 的自定义执行策略和分配器:

#include <thrust/system/cuda/execution_policy.h>
#include <thrust/system/cuda/memory.h>
#include <thrust/system/cuda/vector.h>
#include <thrust/remove.h>

// create a custom execution policy by deriving from the existing cuda::execution_policy
struct my_policy : thrust::cuda::execution_policy<my_policy> {};

// provide an overload of malloc() for my_policy
__host__ __device__ void* malloc(my_policy, size_t n )
{
  printf("hello, world from my special malloc!\n");

  return thrust::raw_pointer_cast(thrust::cuda::malloc(n));
}

// create a custom allocator which will use our malloc
// we can inherit from cuda::allocator to reuse its existing functionality
template<class T>
struct my_allocator : thrust::cuda::allocator<T>
{
  using super_t = thrust::cuda::allocator<T>;
  using pointer = typename super_t::pointer;

  pointer allocate(size_t n)
  {
    T* raw_ptr = reinterpret_cast<T*>(malloc(my_policy{}, sizeof(T) * n));

    // wrap the raw pointer in the special pointer wrapper for cuda pointers
    return pointer(raw_ptr);
  }
};

template<class T>
using my_vector = thrust::cuda::vector<T, my_allocator<T>>;

int main()
{
  my_vector<int> vec(10, 13);
  vec.push_back(7);

  assert(thrust::count(vec.begin(), vec.end(), 13) == 10);

  // because we're superstitious
  my_policy policy;
  auto new_end = thrust::remove(policy, vec.begin(), vec.end(), 13);
  vec.erase(new_end, vec.end());
  assert(vec.size() == 1);

  return 0;
}

这是我的系统上的输出:

$ nvcc -std=c++11 -I. test.cu -run
hello, world from my special malloc!
hello, world from my special malloc!
hello, world from my special malloc!
hello, world from my special malloc!

你可以变得更喜欢并使用thrust::pointer<T,Tag>要合并的包装器my_policy成习惯pointer类型。这样就可以达到标记的效果my_vector的迭代器与my_policy而不是 CUDA 执行策略。这样,您就不必为每个算法调用提供显式执行策略(如示例中调用thrust::remove)。相反,Thrust 只需查看类型即可知道使用您的自定义执行策略my_vector的迭代器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CUDA Thrust 执行策略覆盖 Thrust 的低级设备内存分配器 的相关文章

随机推荐

  • 关于使用指针修改 const 变量的混乱

    以下示例使我的理解更加混乱 我无法理解如何修改本地 const 变量 请帮助我理解同样的事情 Compile code without optimization option volatile c include
  • 将带有通配符的参数传递给 Python 脚本

    我想做这样的事情 c data gt python myscript py csv 并将目录中的所有 csv 文件传递 给我的 python 脚本 这样sys argv包含 file1 csv file2 csv etc But sys a
  • 在 body 之前发送 head 以尽快加载 CSS 和 JS

    我想知道是否有人找到了一种在渲染中间发送 head 标签的方法 以便在页面渲染完成之前加载 CSS 和 Javascript 我们的页面大约需要 523 毫秒来呈现 并且在收到页面之前不会加载资源 我已经完成了很多 PHP 工作 并且可以在
  • 在 NTFS 上打开许多小文件太慢

    我正在编写一个程序 应该处理许多小文件 比如说数千甚至数百万 我一直在 500k 文件上测试该部分 第一步只是迭代一个目录 其中包含大约 45k 目录 包括子目录的子目录等 和 500k 小文件 遍历所有目录和文件 包括获取文件大小和计算总
  • 在 C# 中创建自定义引导程序/引导加载程序

    我们决定为我们的部署解决方案创建一个自定义引导程序 我们目前正在重写和重新设计我们所有产品的部署策略 遗憾的是 我们都不是部署专家 这是到目前为止我们所得到的 答 MSI 包将在 InstallShield 中编写 我们将使用 Instal
  • JNI_OnLoad 返回错误版本 (-1)

    我试图在我的 Android 应用程序中加载 Qt5Core 库 我得到了这个 JNI OnLoad returned bad version 1 in data data com xxx yyy lib libQt5Core so 0x4
  • WPF 中的 NumericUpDown 等效项很好吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 WPF 中寻找一个简单的 NumericUpDown 又名数字微调器 控件 这似乎是WPF中另
  • CSR scipy 矩阵在更新其值后不会更新

    我在 python 中有以下代码 import numpy as np from scipy sparse import csr matrix M csr matrix np ones 2 2 dtype np int32 print M
  • Python 读取文件超时

    在Linux中 有一个文件 sys kernel debug tracing trace pipe 顾名思义 是一个管道 因此 假设我想使用 Python 读取其中的前 50 个字节 我运行以下代码 sudo python c f open
  • Keycloak:从内部 docker 容器运行时令牌颁发者无效

    我在配置 keycloak 在我们的服务器上运行时遇到一些问题 在本地它工作得很好 但在我们的测试环境中 登录后 在使用收到的访问令牌的任何调用中 我们得到 无效的令牌颁发者 预期 http keycloak 8080 auth realm
  • makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始

    CFormat define Format File echo Formatting ifneq wildcard 1 echo if1 The default extensions for intermediate files are n
  • import 语句中的解构赋值

    根据这个source https ponyfoo com articles es6 destructuring in depth以及在某个项目中看到过这种用法的模糊记忆 我很好奇是否有人能够执行以下操作 import map series
  • 如何阻止 WordPress 中的可视化编辑器更改代码?

    每次我切换到 WordPress 中的可视化编辑器时 它都会更改我的代码 例如删除 br 我该如何阻止这个 您不能在基础框架中不添加一些插件 但是 如果您想在可视化编辑器端进行简单的中断 请使用 Shift Enter
  • 如何使用 IE10 播放 HTML5 视频

    我希望有人知道如何帮助我在本地 Intranet 上播放 HTML5 视频 我的 Web 服务器 Windows Server 2008 R2 标准 64 位 IIS版本 IIS7 测试用户环境 Windows 7 Enterprise 使
  • 将内联与显式成员约束相结合时出现奇怪的错误

    更新 我添加了一个重现示例 代码如下所示 type Lib static member inline tryMe a a let name a static member name string name type Test struct
  • 使用 @tffunction 的 Tensorflow2 警告

    此示例代码来自 Tensorflow 2 writer tf summary create file writer tmp mylogs tf function tf function def my func step with write
  • 如何禁用对JSP页面的GET请求?

    我正在修复一些旧缺陷 作为一个缺陷的一部分 我需要确保某些请求仅 POST 到 JSP 页面 而不是 GET 请求 该应用程序有一个表单 可以将数据提交到另一个 JSP 页面 我知道它是错误的并且反对 MVC 但修复它已经太晚了 因为它是一
  • 在 R 中使用 igraph 绘制图形:边长与重量成正比

    我需要为加权无向图绘制一个简单的图 其中唯一的边位于单个中心节点和其他一些节点 即星形网络拓扑 之间 所以我只需要我的节点等距 即之间的角度相同 每对连续的节点 围绕中心节点 但是 我的边缘已加权 我希望边缘长度与权重值成比例 有什么方法可
  • Intellij IDEA构建的war文件位于哪里?

    我正在使用 IntelliJ IDEA 每次运行时都会构建和部署 Web 应用程序项目 所有这一切都在 IntelliJ IDEA 中神奇地发生 但是 现在我应该将其手动部署到测试服务器的 wildfly 上 因此我需要一个工件文件 WAR
  • 如何使用 CUDA Thrust 执行策略覆盖 Thrust 的低级设备内存分配器

    我想重写低级CUDA设备内存分配器 实现为thrust system cuda detail malloc 以便它在调用时使用自定义分配器而不是直接调用cudaMalloc 主机 CPU 线程 这可能吗 如果可以的话 是否可以使用Thrus