编辑:谢谢你之前的回答。但实际上我想在CUDA中做,显然CUDA没有Fill函数。我必须为每个线程填充一次矩阵,所以我想确保我使用的是最快的方法。这是我的最佳选择吗?我想将float的矩阵设置为可能的最大值(在float中)。做这项工作的正确方法是什么?
float *matrix=new float[N*N]; for (int i=0;i<N*N;i++){ matrix[i*N+j]=999999; }
先谢谢你了。
o4tp2gmn1#
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 }
jtoj6r0c2#
使用std::numeric_limits<float>::max()和std::fill作为:
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
std::fill_n(matrix, N*N, std::numeric_limits<float>::max());
请参阅以下联机文档:
rn0zuynd3#
你需要遍历数组,并将每个float元素设置为limits中的std::numeric_limits<float>::max()...你不能使用memset,因为它设置内存缓冲区中的每个字节,而不是像浮点数等多字节值为特定值。所以你最终会得到如下代码,因为你只使用了一个数组作为你的矩阵(也就是说,你不需要第二个for循环):
float
limits
memset
#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将多字节类型的内存缓冲区初始化为一个特定的值,除非你想将这些值清零,或者你正在做一些奇怪的黑客,让你将相同的值写入组成多字节数据类型的所有字节。
db2dz4w84#
我建议轻松地完成这项工作,使用std::fill,而不是在算法头。
std::fill( matrix, matrix + (N*N), 999999 ) ;
bbmckpt75#
在C++中,使用vector代替动态内存,并观察它为您完成所有工作:std::vector<float> matrix(N * N, std::numeric_limits<float>::max());事实上,你甚至可以很容易地将它变成一个2D矩阵:std::vector<std::vector<float> > matrix(N, std::vector<float>(N, std::numeric_limits<float>::max()));
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()));
gorkyyrv6#
C++方式:
std::fill(matrix, matrix + N*N, std::numeric_limits<float>::max());
ckocjqey7#
matrix是全局内存还是线程本地内存?如果它在全局内存中,并且您只需要初始化(而不是在内核中间重置),那么您可以在启动内核之前从主机使用memset。如果它位于内核的中间,考虑将内核分成两部分,这样您仍然可以使用cudaMemset。
matrix
cudaMemset(matrix,std::numeric_limits<float>::max(),N*N*blockSize);
7条答案
按热度按时间o4tp2gmn1#
CUDA中最简单的方法是使用thrust::fill。Thrust包含在CUDA 4.0及更高版本中,如果您使用的是CUDA 3.2,也可以安装它。
你也可以写纯CUDA代码,像这样:
jtoj6r0c2#
使用
std::numeric_limits<float>::max()
和std::fill
作为:或者,
std::fill_n
作为(看起来更好):请参阅以下联机文档:
rn0zuynd3#
你需要遍历数组,并将每个
float
元素设置为limits
中的std::numeric_limits<float>::max()
...你不能使用memset
,因为它设置内存缓冲区中的每个字节,而不是像浮点数等多字节值为特定值。所以你最终会得到如下代码,因为你只使用了一个数组作为你的矩阵(也就是说,你不需要第二个for循环):
你的请求的第二个大问题是,
memset
为每个字节设置的值采用整数类型,所以你必须获得最大浮点值的实际位模式,并将其用作memset
的输入。但即使这样也不行,因为memset
只能将内存缓冲区中的每个字节设置为给定值,因此如果您将表示浮点值的32位整数值传递给memset
,它只会使用低8位。所以最后,这不仅仅是我们不建议你做的事情,而是因为memset
的实现方式是不可能的。你不能使用memset
将多字节类型的内存缓冲区初始化为一个特定的值,除非你想将这些值清零,或者你正在做一些奇怪的黑客,让你将相同的值写入组成多字节数据类型的所有字节。db2dz4w84#
我建议轻松地完成这项工作,使用std::fill,而不是在算法头。
bbmckpt75#
在C++中,使用
vector
代替动态内存,并观察它为您完成所有工作:std::vector<float> matrix(N * N, std::numeric_limits<float>::max());
事实上,你甚至可以很容易地将它变成一个2D矩阵:
std::vector<std::vector<float> > matrix(N, std::vector<float>(N, std::numeric_limits<float>::max()));
gorkyyrv6#
C++方式:
ckocjqey7#
matrix
是全局内存还是线程本地内存?如果它在全局内存中,并且您只需要初始化(而不是在内核中间重置),那么您可以在启动内核之前从主机使用memset。如果它位于内核的中间,考虑将内核分成两部分,这样您仍然可以使用cudaMemset。