CUDA,使用memset(或fill或…)来设置浮点数组的最大可能值
CUDA, using memset(or fill or ...) to set an array of float to max val possible
编辑:感谢之前的回答。但实际上我想在CUDA中做,显然CUDA没有Fill功能。我必须为每个线程填充矩阵一次,所以我想确保我使用最快的方式。这个for循环是我最好的选择吗?
我想将float的矩阵设置为可能的最大值(在float中)。做这项工作的正确方法是什么?
float *matrix=new float[N*N];
for (int i=0;i<N*N;i++){
matrix[i*N+j]=999999;
}
在CUDA中最简单的方法是使用thrust::fill。Thrust包含在CUDA 4.0及更高版本中,或者如果您使用CUDA 3.2,您可以安装它。
#include <thrust/fill.h>
#include <thrust/device_vector.h>
...
thrust::device_vector<float> v(N*N);
thrust::fill(v.begin(), v.end(), std::numeric_limits<float>::max()); // or 999999.f if you prefer
你也可以这样写纯CUDA代码:
template <typename T>
__global__ void initMatrix(T *matrix, int width, int height, T val) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
for (int i = idx; i < width * height; i += gridDim.x * blockDim.x) {
matrix[i]=val;
}
}
int main(void) {
float *matrix = 0;
cudaMalloc((void*)&matrix, N*N * sizeof(float));
int blockSize = 256;
// ceil division
int numBlocks = (N*N + blockSize - 1) / blockSize;
initMatrix<<<numBlocks, blockSize>>>(matrix, N, N,
std::numeric_limits<float>::max()); // or 999999.f if you prefer
}
使用std::numeric_limits<float>::max()
和std::fill
作为:
#include <limits> //for std::numeric_limits<>
#include <algorithm> //for std::fill
std::fill(matrix, matrix + N*N, std::numeric_limits<float>::max());
或者,std::fill_n
为(看起来更好):
std::fill_n(matrix, N*N, std::numeric_limits<float>::max());
查看这些在线文档:
- std::填写
- std:: fill_n
您需要遍历数组并将limits
中的每个float
元素设置为std::numeric_limits<float>::max()
…您不能使用memset
,因为它将内存缓冲区中的每个字节设置为特定值,而不是像浮点数等多字节值。
所以你会结束代码看起来像下面,因为你只使用一个数组为你的矩阵(即,你不需要第二个for循环):
#include <limits>
float* matrix = new float[N*N];
for (int i=0; i < N*N; i++)
{
matrix[i] = std::numeric_limits<float>::max();
}
您的请求的第二个大问题是memset
采用整型值来设置每个字节的值,因此您必须获得最大浮点值的实际位模式,并将其用作memset
的输入。但即使这样也行不通,因为memset
只能将内存缓冲区中的每个字节设置为给定值,因此,如果您将代表浮点值的32位整数值传递给memset
,它只会使用较低的8位…所以最后,这不仅仅是我们不建议你做的事情,但memset
已经实现的方式是不可能的。您根本不能使用memset
将多字节类型的内存缓冲区初始化为特定值,除非您想将这些值归零,或者您正在做一些奇怪的hack,允许您将相同的值写入组成多字节数据类型的所有字节。
我建议轻松完成这项工作,使用std::fill代替算法头。
std::fill( matrix, matrix + (N*N), 999999 ) ;
在c++中不使用动态内存,而是使用vector
,看它为你做所有的工作:
std::vector<float> matrix(N * N, std::numeric_limits<float>::max());
事实上,你甚至可以很容易地使它成为一个二维矩阵:
std::vector<std::vector<float> > matrix(N, std::vector<float>(N, std::numeric_limits<float>::max()));
c++方式:
std::fill(matrix, matrix + N*N, std::numeric_limits<float>::max());
matrix
是全局内存还是线程局部内存?如果它在全局内存中,并且只需要初始化(而不是在内核中间重置),那么可以在启动内核之前从主机使用memset。如果它位于内核的中间,请考虑将内核分成两部分,这样您仍然可以使用cudaMemset。
cudaMemset(matrix,std::numeric_limits<float>::max(),N*N*blockSize);
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 使用 memset 填充数组会显示垃圾
- 使用memset初始化int数组
- 使用memset初始化后,访问违反写作错误写入2D数组
- 可以使用 memset 来填充 std::complex<float>s 数组吗?
- 在双精度类型数组中使用 memset()
- memset 将 -1 放入我的数组中,而不是我指定的值,这是怎么回事
- 清除一个字符数组的最佳方案-是否为memset
- 使用memset将字符串数组设置为0后,该数组不可用
- 在C++中使用具有多维数组的memset
- c++中使用memset初始化具有不同值的struct数组元素
- 通过memset函数设置2D int数组元素为1
- 在c++中正确使用memset和memcpy初始化字符数组
- 为什么memset在2d数组中正确填充0,但在该数组中无法填充1 ?
- 如何使用memset初始化动态二维数组
- memset如何以-1初始化整数数组
- 静态数组上的Memset
- 为什么memset不能在c++11中使用数组容器