【问题标题】:set array values to zero in a mex cuda function在 mex cuda 函数中将数组值设置为零
【发布时间】:2016-11-23 16:18:10
【问题描述】:

我正在编写一个包含 CUDA 代码的 MEX 函数,并且在 Host 函数中我需要将所有数组 A 值重置为浮点 0.0。这似乎可以通过销毁和重新创建数组来工作:

    mxGPUDestroyGPUArray(A);
    A = mxGPUCreateGPUArray(1, &dims, mxSINGLE_CLASS, mxREAL, MX_GPU_INITIALIZE_VALUES);

有没有更自然/优雅的方式来达到同样的效果?

【问题讨论】:

  • 如果你想在mex cuda函数中你应该可以使用cudaMemset
  • 我忘了提到我的数组 A 是一个大小为 [K,K,K] 的 3D 数组。我试过使用 cudaMemset(A, 0.0, (K * K * K) * sizeof(float));但这会在执行时返回一堆错误
  • 我非常确信可以使用cudaMemset。可能需要更完整的描述来解释为什么它不适用于您的情况。
  • 从 Robert 链接的文档中可以看出,cudaMemset 需要一个整数作为参数,而不是您传入的 0.0 浮点数(但不要太担心:具有值的浮点数0.0 实际上有 0 作为二进制表示)。 mxGPUCreateGPUArray 还返回一个 mxGPUArray 对象,该对象应包含指向您的数组的指针(使用 (mxGPUGetData)[mathworks.com/help/distcomp/mxgpugetdata.html]) 获取它。我不确定 MEX 如何在后端实现 3D 数组 - 有特定的 memset 函数用于处理多维填充(倾斜)数组。
  • 补充一点,浮点错误应该在编译阶段抛出,而不是在执行阶段(我实际上从来没有机会使用 MEX,所以我不确定我的评论有多大帮助是)。

标签: arrays cuda mex


【解决方案1】:

cudaMemset 需要一个设备指针,而mxGPUCreateGPUArray 返回一个mxGPUobject。根据文档,应该能够使用mxGPUGetData 获取此指针。此外,value 参数必须是 int 类型,而不是你给它的 float。幸运的是,浮点值 0.0 对应于 0 的二进制(/整数)表示。

(评论中的问题“迁移”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2021-05-26
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多