为 CUDA 实现 32 位内存集的"正确"方法是什么?
What's the 'right' way to implement a 32-bit memset for CUDA?
CUDA有API调用
cudaError_t cudaMemset (void *devPtr, int value, size_t count)
用单字节值填充缓冲区。我想用一个多字节的值填充它。为了简单起见,假设我想用一个32位(4字节)的值填充devPtr
,并且假设我们可以忽略端序。现在,CUDA驱动程序有以下API调用:
CUresult cuMemsetD32(CUdeviceptr dstDevice, unsigned int ui, size_t N)
所以它足以让我只是:从设备内存空间指针获得CUdeviceptr
,然后使驱动程序API调用?还是我还有别的事要做?
从CUDA 3.0开始,运行时API设备指针(以及其他所有东西)都可以与驱动程序API互操作。所以是的,你可以使用cuMemsetD32
来填充一个32位值的运行时API分配。CUdeviceptr
的大小将匹配void *
在您的平台上的大小,它是安全的转换指针从CUDA API到CUdeviceptr
或,反之亦然。
根据talonmies的回答,似乎一个合理的(尽管不美观)方法是:
#include <stdint.h>
inline cudaError_t cudaMemsetTyped<T>(void *devPtr, T value, size_t count);
#define INSTANTIATE_CUDA_MEMSET_TYPED(_nbits)
inline cudaError_t cudaMemsetTyped<int ## _nbits ## _t>(void *devPtr, int ## _nbits ## _t value, size_t count) {
cuMemsetD ## _nbits( reinterpret_cast<CUdeviceptr>(devPtr), value, count);
}
inline cudaError_t cudaMemsetTyped<uint ## _nbits ## _t>(void *devPtr, uint ## _nbits ## _t value, size_t count) {
cuMemsetD ## _nbits( reinterpret_cast<CUdeviceptr>(devPtr), reinterpret_cast<uint ## _nbits ## _t>(value), count);
}
INSTANTIATE_CUDA_MEMSET_TYPED(8)
INSTANTIATE_CUDA_MEMSET_TYPED(16)
INSTANTIATE_CUD_AMEMSET_TYPED(32)
#undef INSTANTIATE_CUDA_MEMSET_TYPED(_nbits)
inline cudaError_t cudaMemsetTyped<float>(void *devPtr, float value, size_t count) {
cuMemsetD32( reinterpret_cast<CUdeviceptr>(devPtr), reinterpret_cast<int>(value), count);
}
(似乎没有cuMemset64
,所以也没有double
)
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在另一个类视图中添加最多2个图表的正确方法是什么
- Eigen:调用lpNorm()的正确方法
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在Visual Studio C++项目中包含源库的正确方法是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 将 c++ 包含添加到日食的正确方法
- 打印字符数组地址的正确方法
- 在C++中全局初始化类的正确方法
- 在C++中访问蓝图类组件的正确方法是什么?
- 等待 qthread 终止的正确方法是什么?
- 使用大量已知常量变量的正确方法
- 将 malloc 转换为新的正确方法
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法