如何实现设备端CUDA虚拟功能?

2024-03-21

我发现 CUDA 不允许将具有虚拟函数的类传递到内核函数中。对于这个限制有什么解决方法吗?

我真的很希望能够在内核函数中使用多态性。

Thanks!


罗伯特·克罗维拉评论中最重要的部分是:

只需在设备上创建对象即可。

所以记住这一点,我正在处理我有一个摘要的情况class Function然后它的一些实现封装了不同的函数及其评估。这是我的代码的简化版本,我如何在我的情况下实现多态性,但我并不是说它不能做得更好......它希望能帮助您理解这个想法:

class Function
{
public:
    __device__ Function() {}
    __device__ virtual ~Function() {}
    __device__ virtual void Evaluate(const real* __restrict__ positions, real* fitnesses, const SIZE_TYPE particlesCount) const = 0;
};

class FunctionRsj : public Function
{
private:
    SIZE_TYPE m_DimensionsCount;
    SIZE_TYPE m_PointsCount;
    real* m_Y;
    real* m_X;
public:
    __device__ FunctionRsj(const SIZE_TYPE dimensionsCount, const SIZE_TYPE pointsCount, real* configFileData)
        : m_DimensionsCount(dimensionsCount),
            m_PointsCount(pointsCount),
            m_Y(configFileData),
            m_X(configFileData + pointsCount) {}

    __device__ ~FunctionRsj()
    {
        // m_Y points to the beginning of the config
        // file data, use it for destruction as this 
        // object took ownership of configFilDeata.
        delete[] m_Y;
    }

    __device__ void Evaluate(const real* __restrict__ positions, real* fitnesses, const SIZE_TYPE particlesCount) const
    {
        // Implement evaluation of FunctionRsj here.
    }
};

__global__ void evaluate_fitnesses(
    const real* __restrict__ positions,
    real* fitnesses,
    Function const* const* __restrict__ function,
    const SIZE_TYPE particlesCount)
{
    // This whole kernel is just a proxy as kernels
    // cannot be member functions.
    (*function)->Evaluate(positions, fitnesses, particlesCount);
}

__global__ void create_function(
    Function** function,
    SIZE_TYPE dimensionsCount,
    SIZE_TYPE pointsCount,
    real* configFileData)
{
    // It is necessary to create object representing a function
    // directly in global memory of the GPU device for virtual
    // functions to work correctly, i.e. virtual function table
    // HAS to be on GPU as well.
    if (threadIdx.x == 0 && blockIdx.x == 0)
    {
        (*function) = new FunctionRsj(dimensionsCount, pointsCount, configFileData);
    }
}

__global__ void delete_function(Function** function)
{
    delete *function;
}

int main()
{
    // Lets just assume d_FunctionConfigData, d_Positions,
    // d_Fitnesses are arrays allocated on GPU already ...

    // Create function.
    Function** d_Function;
    cudaMalloc(&d_Function, sizeof(Function**));
    create_function<<<1, 1>>>(d_Function, 10, 10, d_FunctionConfigData);

    // Evaluate using proxy kernel.
    evaluate_fitnesses<<<
        m_Configuration.GetEvaluationGridSize(),
        m_Configuration.GetEvaluationBlockSize(),
        m_Configuration.GetEvaluationSharedMemorySize()>>>(
        d_Positions,
        d_Fitnesses,
        d_Function,
        m_Configuration.GetParticlesCount());

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

如何实现设备端CUDA虚拟功能? 的相关文章

  • 如何获取要执行的 PTX 文件

    我知道如何生成 ptx文件来自 cu以及如何生成 cubin文件来自 ptx 但我不知道如何获得最终的可执行文件 更具体地说 我有一个sample cu文件 编译为sample ptx 然后我使用 nvcc 来编译sample ptx to
  • CUDA全局内存事务的成本

    根据 CUDA 5 0 编程指南 如果我同时使用 L1 和 L2 缓存 在 Fermi 或 Kepler 上 则所有全局内存操作都使用 128 字节内存事务完成 但是 如果我仅使用 L2 则使用 32 字节内存事务 第 F 4 2 章 让我
  • C 中带括号和不带括号的循环处理方式不同吗?

    我在调试器中单步执行一些 C CUDA 代码 如下所示 for uint i threadIdx x i lt 8379 i 256 sum d PartialHistograms blockIdx x i HISTOGRAM64 BIN
  • 使用常量内存打印地址而不是cuda中的值

    我试图在代码中使用常量内存 并从内核分配常量内存值 而不是使用 cudacopytosymbol include
  • 虚拟构造函数习惯和工厂设计

    在虚拟构造函数习惯用法中 有一些虚拟函数可以使用虚拟函数返回新对象或对象的副本 但是要以多态方式调用这些虚函数 您必须使用实际的构造函数创建该类的对象 在设计模式上下文中 这意味着客户端在使用多态对象创建方式之前知道对象的类型 客户端不必知
  • 将 GPUJPEG 项目移植到 Windows

    我目前正在尝试移植 GPUJPEG 在 Sourceforge 上 http sourceforge net projects gpujpeg 库 基于 CUDA 从 Unix 到 Windows 现在我被卡住了 我不知道发生了什么或为什么
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

    我正在编写一个使用表面 重新采样并写入纹理 来提高性能的库 surface
  • 多个进程可以共享一个 CUDA 上下文吗?

    这个问题是 Jason R 的后续问题comment https stackoverflow com questions 29964392 multiple cuda contexts for one device any sense co
  • 为什么numba cuda调用几次后运行速度变慢?

    我正在尝试如何在 numba 中使用 cuda 然而我却遇到了与我预想不同的事情 这是我的代码 from numba import cuda cuda jit def matmul A B C Perform square matrix m
  • 在linux上编译一个基本的OpenCV + Cuda程序

    我过去在linux上使用过opencv 但没有使用过cuda 几个月来我一直在与以下编译错误作斗争 在尝试了许多解决方案后 我放弃并使用 Windows 不过 我真的很想在 Linux 上工作 这是我用来编译 opencv gpu 网站上给
  • CUDA Visual Studio 2010 Express 构建错误

    我正在尝试在 64 位 Windows 7 上使用 Visual Studio 2010 Express 在 Windows 上开始 CUDA 编程 我花了一段时间来设置环境 然后我刚刚编写了我的第一个程序 helloWorld cu 目前
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • Arduino C++ 代码:可以使用虚函数和异常吗?

    跟进这条评论 https stackoverflow com questions 452139 writing firmware assembly or high level 452401从问题中编写固件 汇编还是高级 https stac
  • 与智能指针的返回类型协方差

    在 C 中我们可以这样做 struct Base virtual Base Clone const virtual Base struct Derived Base virtual Derived Clone const overrides
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • __device__ __constant__ 常量

    有什么区别吗 在 CUDA 程序中定义设备常量的最佳方法是什么 在 C 主机 设备程序中 如果我想将常量定义在设备常量内存中 我可以这样做 device constant float a 5 constant float a 5 问题 1

随机推荐

  • DOCX w:t(文本)元素跨越多个 w:r(运行)元素?

    我们编写了一个软件 可以从 Word 文档的内部 XML 文件中处理 XML 并用替换值替换某些代码 有时我们发现此类代码在多次运行之间被破坏 以下是我们有时会遇到的此类情况的示例
  • 为子类添加额外的“方法”

    这是一个概念性问题 旨在了解如何在 C 中完成 OOP 技术 我知道它不实用或不推荐 并且有许多语言可以更好地实现此目的 但我只是看看作为初学者如何完成它到 C 假设我有一个名为的基础对象Thing 它将有一些数据和一些功能 然后我想添加另
  • 出现 TypeError:this.props 在 ReactJs 上未定义

    我正在尝试做教程 https facebook github io react docs tutorial html https facebook github io react docs tutorial html import Reac
  • 带有“fromCharCode”(字符长度)的 Javascript 映射数组

    以下内容来自 Chrome 控制台中的交互式会话 myarray gt 67 65 84 String fromCharCode 67 gt C String fromCharCode 67 length gt 1 String fromC
  • 可利用的 C# 函数 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这个问题类似于可利用的 PHP 函数 https stackoverflow com questions 3115559 exploi
  • Kendo UI 绑定弹出编辑器中的下拉值

    我有一个 Kendo 网格 它可以选择使用弹出编辑器添加新记录 弹出编辑器中的一个字段是 DropDownList 当我打开弹出编辑器时 我从下拉列表中预先选择了第一条记录 由于我预先选择了它 我希望它在网格内自动创建 绑定 当按 更新 时
  • Python 会缓存重复访问的文件吗?

    我想知道 Python 是否足够聪明 可以缓存重复访问的文件 例如当使用 pandas 读取相同的 CSV 或多次 unpickle 相同的文件时 这是否是 Python 的责任 还是应该由操作系统来处理 不 Python 只是一种语言 它
  • Snakemake - 如何使用文件的每一行作为输入?

    我需要使用文件的每一行tissuesused txt作为snakemake中并行规则的输入 我想总共大约有 48 个工作机会 for line in cat tissuesused txt do echo Sorting line phen
  • 如何与具有哈希属性的 Perl 对象交互?

    我有一个包含多个变量的类 其中一个是散列 runs sub new my class name my self name gt name runs gt times gt bless self class return self 现在 我要
  • 无法访问VueJS中的根数据

    这是我在 stackoverflow 上的第一篇文章 如果我做错了什么 请提前抱歉 我的问题 我已经设置了一个 VueJS 项目 并且正在尝试从另一个组件获取放入 App vue 中的数据 为此 我使用 this root count 为例
  • 带条件的 LINQ to SQL 急切加载

    我正在尝试学习 LINQ to SQL 并且发现了 LoadWith 函数 我找到的所有示例都会加载您在 LoadWith 函数中指定的表中的所有记录 例如 var dlo new DataLoadOptions dlo LoadWith
  • 在 IMAP 收件箱中搜索来自特定发件人的邮件并使用通配符?

    是否可以使用通配符在 IMAP 文件夹中搜索特定发件人 typ data M SEARCH None from security website IMAP RFC 3501 6 4 4 https www rfc editor org rf
  • 如何在 C# 6.0 中实现 INotifyPropertyChanged?

    答案是这个问题 https stackoverflow com questions 1315621 implementing inotifypropertychanged does a better way exist 1316417 13
  • 仅使用 javascript 将信息提交到 Google Drive 电子表格

    我基本上正在寻找一种仅使用 javascript 将信息提交到 Google Drive 电子表格的方法 更改特定单元格的值就是我所追求的 有人知道这是否可能吗 谢谢 这是在本地主机中工作的正确代码 就像在网站中一样 如果您有适当的客户端
  • Kafka Connector 的任务列表为空

    在卡夫卡启动后 有时我会出现这种行为 并非总是如此 似乎是随机的 org apache kafka connect runtime rest errors ConnectRestException Internal request miss
  • 在导航抽屉 Android 上添加 EditText

    我正在开发一个带有导航抽屉的新应用程序 使用 Android 模板 但我想用其他视图替换默认的列表视图 SOLVED 我必须编辑 java 代码来修改 createView 方法以与我的布局匹配 谢谢大家 问题 我的班级从ActionBar
  • 如何使用 Rustup 删除 Rust 编译器工具链?

    Rustup 文档展示了如何每晚安装 Rust https github com rust lang nursery rustup rs working with nightly rust 但不知道如何删除它 虽然文档确实显示了如何卸载ru
  • ArrayList 与通用集合

    在 NET 2 0 中使用 ArrayList 代替泛型集合有何优缺点 通用集合是类型安全的 你不能将string into a List
  • 核心数据 - 基本问题

    我想知道以下内容在 Objective C 中是如何工作的 在我的头文件中 我有以下内容 它是从不同的视图控制器初始化的 interface UserLookup UIViewController NSManagedObjectContex
  • 如何实现设备端CUDA虚拟功能?

    我发现 CUDA 不允许将具有虚拟函数的类传递到内核函数中 对于这个限制有什么解决方法吗 我真的很希望能够在内核函数中使用多态性 Thanks 罗伯特 克罗维拉评论中最重要的部分是 只需在设备上创建对象即可 所以记住这一点 我正在处理我有一