我的目的是将输入矩阵分割成多个子矩阵,然后求子矩阵中的最大值?
新手、新手,搞了一两天都没弄懂。求版主大牛们帮忙啊
LZ您好:
请详细叙述您的问题和实现意图。
如果您不补充您的具体情况,本帖将被转移到水区,敬请谅解。
不够详细吗?
假如输个一个44的矩阵,我现在想把矩阵分成22大小的子矩阵,然后把每个子矩阵的最大值赋给一个2*2的矩阵返回现实。
LZ您好:
您这个问题实现起来并无难度,简单说,您可以一个block计算一个子矩阵的最大值,然后根据blockIdx回写到结果的矩阵中。
block内部实现寻找最大值可以使用规约方法快速实现。
以及您需要安排好线程规模和寻址等方面。
祝您实现顺利~
以及我再稍微补充一下:
实际上您的这个原本的矩阵并不需要真的进行“分割”并保存,您只需要按照分割的逻辑进行寻址访问数据即可。也就是在CUDA实现的时候,您只需要维护好各个block内部的寻址即可。
如果您本身明白这一点,请无视本楼。
祝您好运~
瞬间觉得自己弱爆了,版主可以给我写下代码好让我学习下么?谢谢了
我先附上我写的:
dim3 grid(2,3,1);
dim3 thread(2,2,1);
MatrixSeg<<<grid,thread>>>(d_a,d_b);
global void MatrixSeg(int a, int b)
{
int i = blockIdx.x;
//int k = THREAD_NUM;
int j = blockIdx.y;
//shared int A[4];
//A[4j + i] = a[4j + i];
b[j*2 + i] = a[这个地方找不到每个子矩阵的位置]
}
版主好,你说的“block内部实现寻找最大值可以使用规约方法快速实现。
以及您需要安排好线程规模和寻址等方面。”
这些不懂,可以说详细点吗?先谢谢啊,有没有什么推荐的书看看这方面的知识?
LZ您好:
1:不能根据您的问题直接给出具体实现的,只能和您讨论,请您理解这一点。
2:根据您6#的写法,这个只是简单的赋值,这并不和您之前的需求相符。
3:假定您线程和数据是一一对应的,也就是一个线程对应一个数据,以及是2维数组/线程的形式,那么一种常见的利用线程编号辅助寻址的方法为:
tid_x=blockIdx.xblockDim.x+threadIdx.x;
tid_y=blockIdx.yblockDim.y+threadIdx.y;
这样tid_x和tid_y是某种全局的线程index,而线程和数组中的数据index是一一对应的,所以您可以通过线程index来访问数组中的数据。
4:之后您可以在block内部进行规约操作求最大值,您可以参考programming guide中的规约操作讲述。如果您需要使用shared memory进行规约操作,那么您还需要线程在block内部的index进行对shared memory的辅助寻址。
您可以
tid_x_inblock=threadIdx.x;
tdi_y_inblock=threadIdx.y;
或者使用其一维化的index tid_inblock=threadIdx.y*blockDim.x+threadIdx.x;
5:以及使用shared memory请注意同步,并在最后得到结果以后,选定一个线程回写到global memory中。
6:顺便说一句,您的数据规模太小,不适合使用GPU,不过考虑到您这个可能只是一个示例,请您明白这一点即可。
祝您好运~
实在愧对版主那么详细的解释,我到现在还没有搞定子矩阵最大值的提取。
不知道版主有时间可以给我写下具体实现程序不?
比如是88随机生成的矩阵,我想将它分为44大小的4个子矩阵,然后提取每个子矩阵的最大值放给2*2的输出矩阵,并且关系位置相对应。万分感谢版主前面的解答,本人刚开始接触cuda,最近被这个问题完全搞晕了。
实在愧对版主那么详细的解释,我到现在还没有搞定子矩阵最大值的提取。
不知道版主有时间可以给我写下具体实现程序不?
比如是88随机生成的矩阵,我想将它分为44大小的4个子矩阵,然后提取每个子矩阵的最大值放给2*2的输出矩阵,并且关系位置相对应。万分感谢版主前面的解答,本人刚开始接触cuda,最近被这个问题完全搞晕了。
LZ您好:
请您参考8# 第一点。
如您的目的是学习使用CUDA,请参考8#其余各点并学习CUDA C入门知识后实现。
如您的目的是快速得到某具体实现,请联系第三方公司洽谈外包事宜。
祝您好运~
哈哈 不好意思!谢谢版主了