【发布时间】: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,所以我不确定我的评论有多大帮助是)。