2016-11-22 109 views
0

我正试图在3x3矩阵和360x360矩阵之间进行矩阵乘法。较小的矩阵(3x3)将用大矩阵的第一个(3x3)块等操作。因此,我想让我的小矩阵保持不变,并将其滑过我的大矩阵。cuda:使用共享和全局的矩阵乘法

是否可以将我的较小矩阵存储为共享内存的一部分,并将我的较大矩阵划分为全局3x3?

我没有找到方法来复制较小的矩阵,直接从主机共享。如果我的cuda可视化是错误的,请纠正我。

谢谢。

+2

你不能从主机复制到共享内存。这不被支持。 – talonmies

回答

1

无法从主机填充共享内存。

但是,处理所有线程(如您的示例中的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 
    
+0

非常感谢你的真棒回答。你能提供任何使用这个__constant__类型限定符和cudaMemcpyToSymbol的例子。这将会非常有帮助。提前致谢。 –

+1

我添加了cudaMemcpyToSymbol的示例用法,希望这有助于! – ptrendx