如何使用CUDA c++将矢量与矩阵相乘
How can multiply vector by a matrix using CUDA c++
有人能帮我吗?我如何使用CUDA c++将向量(1*N(和矩阵(N*M(相乘,并将结果存储在新向量(1*M(上。
我想StackOverflow是提问和讨论解决方案的地方。虽然这个问题被很多人否决了,但我已经回答了这个问题。也许询问者需要就可用的解决方案进行一些讨论。以下是适用于大型M
:的代码
#include <stdio.h>
#include <cuda.h>
#include <time.h>
__global__
void kernel(float *vec, float *mat, float *out, const int N, const int M){
int tid=threadIdx.x+blockIdx.x*blockDim.x;
float sum=0;
if(tid<M){
for(int i=0; i<N; i++)
sum += vec[i]*mat[(i*M)+tid];
out[tid]=sum;
}
}
// debuging functions
void init_array(float *a, const int N);
void init_mat(float *a, const int N, const int M);
void print_array(float *a, const int N, char *d);
void print_mat(float *a, const int N, const int M, char *d);
int main (void) {
srand( time(NULL) );
float *a, *b, *c;
float *dev_a, *dev_b, *dev_c;
int N=3;
int M=4;
a=(float*)malloc(sizeof(float)*N);
b=(float*)malloc(sizeof(float)*N*M);
c=(float*)malloc(sizeof(float)*M);
init_array(a, N);
init_mat(b, N, M);
init_array(c, M);
printf("<<<<<<<<<< initial data:n");
print_array(a, N, "in-vector");
print_mat(b, N, M, "matrix");
print_array(c, M, "out-vector");
cudaMalloc((void**)&dev_a, sizeof(float)*N);
cudaMalloc((void**)&dev_b, sizeof(float)*N*M);
cudaMalloc((void**)&dev_c, sizeof(float)*M);
cudaMemcpy(dev_a, a, sizeof(float)*N, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, sizeof(float)*N*M, cudaMemcpyHostToDevice);
printf("nnRunning Kernel...nn");
kernel<<<M/256+1, 256>>>(dev_a, dev_b, dev_c, N, M);
//printf("error code: %sn",cudaGetErrorString(cudaGetLastError()));
cudaMemcpy(c, dev_c, sizeof(float)*M, cudaMemcpyDeviceToHost);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
printf(">>>>>>>>>> final data:n");
print_array(c, M, "out-vector");
return 0;
};
void init_array(float *a, const int N) {
int i;
for(i=0; i<N; i++)
a[i] = rand() % 4 + 1;
}
void init_mat(float *a, const int N, const int M) {
int i, j;
for(i=0; i<N; i++)
for(j=0; j<M; j++)
a[i*M+j] = rand() % 4 + 1;
}
void print_array(float *a, const int N, char *d) {
int i;
for(i=0; i<N; i++)
printf("n%s[%d]: %f",d, i, a[i]);
printf("n");
}
void print_mat(float *a, const int N, const int M, char *d) {
int i, j;
for(i=0; i<N; i++){
printf("n%s[%d]:", d, i);
for (j=0; j<M; j++)
printf("t%6.4f", a[i*M+j]);
}
printf("n");
}
它需要进行小的修改以适应大型N
。
相关文章:
- 使用 CUDA 和纹理进行图像减法
- 使用 CUDA Ubuntu 16/04 构建 C++ OpenCV 4
- 如何增加使用 CUDA 实现的 FLOPS
- 有没有办法使用 cuda 在设备上计算 tgammaf(50)?
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- GPU 内存访问和使用 (CUDA)
- OPENCV 3.2是否与CUDA 10兼容?我如何在使用CUDA 10的系统上编译和构建OpenCV 3.2
- 使用std ::数组使用CUDA推力来端口C 代码的简便方法
- 如何在C++类中正确使用 CUDA 中的块和线程
- 当我使用 cuda 时,如何从 std::map 中搜索值
- 未定义的参考,差异使用 CUDA 的 OpenCV 中的双边过滤器
- 使用 CUDA 迭代多个图像会提高性能吗?
- 使用cuda的平行尺寸降低(3d至2d)
- 为什么CMAKE add_依赖项不适用于使用CUDA代码的库
- 图像中使用CUDA中的白色像素索引列表
- 使用CUDA编译OpenCV示例程序时出错
- 使用 cuda 将通道与 RGBA 图像分离(无法显示完整图像)
- 是否可以使用CUDA并行化此嵌套进行循环
- 使用cuda并联特征值求解器