cuda:使用共享和全局的矩阵乘法
cuda: matrix multiplication using shared and global
我正在尝试在 3x3 矩阵和 360x360 矩阵之间进行矩阵乘法。较小的矩阵 (3x3) 将使用大矩阵的第一个 (3x3) 块进行操作,依此类推。因此,我想要较小的矩阵常数并将其滑过较大的矩阵。
是否可以将较小的矩阵存储为共享内存的一部分,并将较大的矩阵分成 3x3 全局?
我找不到将较小的矩阵复制到直接从主机共享的方法。如果我对cuda的可视化有误,请指正。
谢谢。
无法从主机填充共享内存。
但是,处理所有线程的常量(例如示例中的 3x3 矩阵)的最佳方法是将它们放在常量内存中(其大小为 64 kB)。常量内存有两种使用方式:
- 最简单的方法是使用内核参数。定义一个
struct
包含你的内核参数,包括 3x3 矩阵,并将它传递给你的内核
使用 __constant__
类型限定符并使用 cudaMemcpyToSymbol
从主机填充它:
//In global scope
__constant__ float mat_gpu[3][3];
//In the function that you use to populate the data
cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float));
//In your kernel you just use the mat_gpu variable
我正在尝试在 3x3 矩阵和 360x360 矩阵之间进行矩阵乘法。较小的矩阵 (3x3) 将使用大矩阵的第一个 (3x3) 块进行操作,依此类推。因此,我想要较小的矩阵常数并将其滑过较大的矩阵。
是否可以将较小的矩阵存储为共享内存的一部分,并将较大的矩阵分成 3x3 全局?
我找不到将较小的矩阵复制到直接从主机共享的方法。如果我对cuda的可视化有误,请指正。
谢谢。
无法从主机填充共享内存。
但是,处理所有线程的常量(例如示例中的 3x3 矩阵)的最佳方法是将它们放在常量内存中(其大小为 64 kB)。常量内存有两种使用方式:
- 最简单的方法是使用内核参数。定义一个
struct
包含你的内核参数,包括 3x3 矩阵,并将它传递给你的内核 使用
__constant__
类型限定符并使用cudaMemcpyToSymbol
从主机填充它://In global scope __constant__ float mat_gpu[3][3]; //In the function that you use to populate the data cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float)); //In your kernel you just use the mat_gpu variable