gpt4 book ai didi

c - 使用 Cuda 进行非方阵乘法

转载 作者:行者123 更新时间:2023-11-30 21:13:13 24 4
gpt4 key购买 nike

最近几天我开始使用 cuda。编写一个将两个大小为 N x N 的矩阵相乘的程序是没有问题的。在内核函数中我使用了以下代码:

    for(int i = 0; i < width; i++){
sum += a[row * width + i] * b[i * width + col];
c[row * width + col] = sum;
}

如何设计核函数来将大小为 1 x N 的矩阵与大小为 N x M 的矩阵相乘

最佳答案

我现在已经找到了解决这个问题的方法:

    #include <stdio.h>
#include <iostream>

using namespace std;

__global__
void kernel(float *a, float *b, float *c, int N, int M) {
int tid = threadIdx.x + blockIdx.x * blockDim.x;
float sum = 0;
if (tid < M) {
for (int i = 0; i < N; i++)
sum += a[i] * b[(i * M) + tid];
c[tid] = sum;

}
}

int main(void) {

float *dev_a, *dev_b, *dev_c;

int N = 16;
int M = 12;

float a[N];
float b[N][M];
float c[M];

for (int i = 0; i < N; i++) {
a[i] = 1.0;
}

for (int i = 0; i < N; i++) {
for (int e = 0; e < M; e++) {
b[i][e] = 1.0;
}
}

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);

kernel<<<M / 256 + 1, 256>>>(dev_a, dev_b, dev_c, N, M);

cudaMemcpy(c, dev_c, sizeof(float) * M, cudaMemcpyDeviceToHost);

cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);

for (int i = 0; i < M; i++) {
cout << c[i] << endl;
}

return 0;
}

但是我还有一个问题。出于性能原因将内核中的 for 循环操作拆分为多个内核是否有意义?

关于c - 使用 Cuda 进行非方阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39264285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com