在cuda c中乘两个矩阵

在cuda c中乘两个矩阵,cuda,Cuda,我需要矩阵A(32*32)和B(32*n),其中“n”来自输入,介于2000到2000000之间 我有两种输入,一种是0到255之间的整数,另一种是0,1。这个乘法在一个循环中,循环次数为3000次。B(32*n)来自输入,在所有迭代中都是常量,但A(32*32)在每次迭代中都可能发生变化 //read B from file //read A from file double D[3000]; for(int i = 0; i < 3000; i++) { C = multipl

我需要矩阵A(32*32)和B(32*n),其中“n”来自输入,介于2000到2000000之间

我有两种输入,一种是0到255之间的整数,另一种是0,1。这个乘法在一个循环中,循环次数为3000次。B(32*n)来自输入,在所有迭代中都是常量,但A(32*32)在每次迭代中都可能发生变化

//read B from file
//read A from file
double D[3000];
for(int i = 0; i < 3000; i++)
{
    C = multiply(A, B);
    // D[i] = mean of all elements in C
    // build A from B using D[i] (this part is really complicated sequential process that contains lots of if and switches)
}
//从文件中读取B
//从文件中读取
双D[3000];
对于(int i=0;i<3000;i++)
{
C=乘(A,B);
//D[i]=C中所有元素的平均值
//使用D[i]从B构建A(这部分是非常复杂的顺序过程,包含大量if和switch)
}
最快的方法是什么?
谢谢。

这里没有人会为您编写代码,这不是堆栈溢出的目的。但是,问题似乎有许多特征,您应该利用这些特征来提高代码的性能:

  • 请认识到,因为其中一个矩阵只包含0或1,并且您在整数中执行此操作,所以您所描述的矩阵乘法实际上是大量独立的稀疏和
  • 认识到,因为下一个操作是计算平均值,所以实际上不必存储中间点积,并且可以直接对矩阵行求和的部分结果进行缩减

  • 推力库中可能有用于原型制作的并行原语,而最佳的手写内核旨在将操作的第一部分和第二部分的大部分融合到单个内核中。

    您尝试过什么吗?准备好的解决方案怎么样?实际上,我擅长C++,但我是CUDA的初学者。我需要优化一段代码,这部分代码占用了大部分时间。我什么都没试过,希望你们能帮我。你们还没说过什么类型的。单、双、整数?(这会对性能产生巨大影响,具体取决于您计划使用的GPU)。此外,如果这是您计划迁移到GPU的代码的唯一部分,请做好失望的准备。当内积只有32 x 32时,没有太多的触发器。我必须输入一个介于0到255之间的整数,另一个是0,1。这个乘法在一个循环中,循环次数为3000次。B(32*n)来自输入,在所有迭代中都是常量,但A(32*32)在每次迭代中都可能发生变化。你应该自己尝试一下。要求他人为您翻译代码的问题是不受欢迎的。此外,如果你不了解CUDA,把一段CUDA代码放在膝盖上也没什么好处。谢谢。但我想你误会我了。我不想让任何人帮我写洞码。这就是为什么我先问矩阵乘法部分。我想知道如何处理线程,以防它们太多,而我们不知道开始时有多少线程。即使您可以给我发送一个处理相同问题的示例代码也会很有帮助。你问我洞的问题是什么,我告诉你了。对不起,我不会给你寄任何东西。我已经提供了一些建议,说明如何以一种对GPU来说应该是快速的方式实现操作。现在你的工作就是写它。如果您的实现有问题,那么一定要回来问一个关于这个问题的新问题。