[闲聊/讨论] CUDA新手入门,一个简单矩阵问题

[复制链接]
百家梦泽 2013-11-10 23:53:29
今天CUDA技术群里meteor兄提了个问题如下
$ G! n) ^+ o1 I" H$ x引用! y+ f& I4 ]. S) F: Q: j: k
x x x x y y y y , h( F* m7 X4 ?: }1 @
x x x x y y y y
( ^9 q5 H9 o$ f( Xx x x x y y y y 5 E8 {" `7 H. U% ?0 e
x x x x y y y y 4 G5 b1 b8 d. O& Q
z z z z a a a a ! k/ g8 ?8 O2 S, h& L
z z z z a a a a 4 q8 C' V: y$ h/ @( @3 z% T; b! Z
z z z z a a a a
. g2 [; `+ z3 ]z z z z a a a a 6 q- ^ J# q( a% u/ B
V+ S% g2 {8 ?8 m
比如这个矩阵 n, H, L. ~' D# Q
我想对x那些数加一,对y那些数加二 7 u% ]0 # d! q1 v
对z那些书加三,对a那些数加四 8 j' R9 k5 V7 y% Z, x( O5 T/ [
. a; _9 w8 j, s0 ^7 l+ v
介于meteor兄是新手,本着互相学习,下面是我写的一段很很简单的程序,完成上述操作,希望对meteor兄有所帮助 6 }7 V: z4 |. C' @* P

, d$ M; {4 T' @% ~; _/ j+ x
( w: U" Y; m& I* QC/C++ code
0 U) b. V* {- X L( b9 {7 J#include <stdio.h>2 H, T8 ?0 F9 R/ M/ q
|5 K" Y( U! V7 g; z0 C
__global__ void testkernel(int *d_A, size_t size)# ` E6 u; m% k! X: h$ T7 l
{2 `5 J6 [( G% m
int dx = blockDim.x * blockIdx.x + threadIdx.x;
/ |& Z' - M2 W A+ f int dy = blockDim.y * blockIdx.y + threadIdx.y;( ` C. w% o, K* R: c$ R) e- k
4 S l- | Z0 j2 S* A+ r$ m9 J
if( blockIdx.x == 0 && blockIdx.y == 0 )
" i J# d' Y `% d9 ]. @) s d_A[dx*size+dy] += 1;' i" n: K% Y% ! T* l: `
if( blockIdx.x == 0 && blockIdx.y == 1 )# M, F4 ?. |$ u& u
d_A[dx*size+dy] += 2;
! L0 b$ ?+ j5 O) f( H if( blockIdx.x == 1 && blockIdx.y == 0 )
, h7 N% D$ g; c d_A[dx*size+dy] += 3;* P" `# E: d3 | R" p! T. Z
if( blockIdx.x == 1 && blockIdx.y == 1 )" u5 h& p' F8 X. A' {
d_A[dx*size+dy] += 4;
! ^5 ^: F2 m/ d) I& @( I}
7 ^1 }4 [3 J& |
: |+ W- ~& a L |3 |1 aint main( int argc, char** argv)
$ R6 I. p# J9 A u$ E9 F{# }% e" i& n" }$ H
int h_A[8][8] = {{1,1,1,1,2,2,2,2},! Z4 l4 }- N; J, w) ]% ]
{1,1,1,1,2,2,2,2},- M; @- j" _- k+ i8 d
{1,1,1,1,2,2,2,2},& i; D7 y5 O7 p, h9 {# @: ~
{1,1,1,1,2,2,2,2},
4 }& Q! U3 T( e3 }; F {3,3,3,3,4,4,4,4},
4 v; k; _0 h# l- P0 v' e {3,3,3,3,4,4,4,4},
9 O; M% e: P1 U' c5 X7 i {3,3,3,3,4,4,4,4},
) X1 y( Z0 f* f4 L9 Z2 [7 X {3,3,3,3,4,4,4,4}};' O; Z7 [4 d- Y9 `4 w/ e
8 c* W9 u"s- l- u/ b% Q6 [4 E
int *d_A, *h_B;; }% ?8 a2 W& U
size_t size = 8 * 8 * sizeof(int);
, E* b0 Z3 W J/ ~0 h* Y+ g9 Lsize_t rsize = 8;
& d7 D2 l8 x( Zdim3 dimgrid(2,2);$ I u y, J% o2 X
dim3 dimblock(4,4);0 M8 J8 G# T1 N7 t* E
$ D) ^) M y4 s/ x5 G: X
h_B = (int*)malloc(size);- l. f8 a( p+ 9 F' S6 M- W

8 U. Z4 l& Z+ A- K- U0 D. @1 S0 EcudaMalloc( (void **) &d_A, size );0 i9 @8 }& m! Y4 |
cudaMemcpy( d_A, h_A, size, cudaMemcpyHostToDevice );
a$ U( }' ?) |) D, N/ Q* ^1 I0 }0 o N
testkernel<<<dimgrid,dimblock>>>(d_A,rsize);
7 L% T: w( p1 }$ H8 S# h5 # O' L# d5 T
cudaMemcpy( h_B, d_A, size, cudaMemcpyDeviceToHost );* u; g. I2 p8 I# X& A: L: d
: E; S6 E; z. U7 ^( }" Z
for(int i = 0; i < 8; i++)
; @4 K4 [1 V2 O5 |. ]0 p{
. A. h* }) O; N! P for(int j = 0;j < 8; j++): W& f) {& _6 {0 F6 _
printf("%2d ",h_B[i*rsize+j]);( C. g" ^8 s7 t ^
printf("n");
0 G, L3 z; x t7 L" ]}0 |) G% T- k. k# L
* , I2 n p- o' g
cudaFree(d_A);
! u! f, n2 S5 ]0 i2 q' S# m* }8 free(h_B);
V1 t8 p2 W9 `+ u}" ~8 R# X7 e: T; Y2 g3 _

. Y/ c3 B2 9 u4 t0 o0 a: _. M' d9 u% m
5 e* I* F/ d1 `. T8 K5 u6 r+ {1 I( _6 Q# ^5 @
$ [0 B& W8 n. F1 v& T& k! N
5 H) e8 ]( z. W! K) |1 t3 t4 z
介于meteor兄不理解blockDim.x和threadIdx.x,下面借上面这个例子解释,具体的请参见Programme Guide
5 x! k; H) z; h' OblockDim就是指block的维度,这里每个block是4*4的,所以blockDim.x=4 blockDim.y = 4
8 V- Y+ R/ T# ~9 {7 k! a1 dthreadIdx就是指block里的线程的索引号,这里每block是4*4维的,每个block里有16个thread,每个thread的threadIdx.x从0到3,threadIdx.y从0到3,和数组一样,这样解释行吗?
6 {* @( l0 `# T/ p0 C0 j0 Q8 l: T' A7 o0 r$ x& % b( E5 O
以上程序测试通过。。。。
林竹 2013-11-11 00:02:09
为毛老子总也抢不到沙发?!!
回复

使用道具 举报

小新的微笑 2013-11-11 01:35:19
为了三千积分!
回复

使用道具 举报

龙妙音 2013-11-11 02:30:54
确实不错,顶先
回复

使用道具 举报

秋咸英 2013-11-11 04:09:12
传说中的沙发???哇卡卡
回复

使用道具 举报

羊晏静 2013-11-11 05:53:16
路过的帮顶
回复

使用道具 举报

况雪毓 2013-11-11 05:53:16
报告!别开枪,我就是路过来看看的。。。
回复

使用道具 举报

仲孙栋 2013-11-11 05:53:16
呵呵。。。
回复

使用道具 举报

阳君洁 2013-11-11 07:03:03
不错 支持下
回复

使用道具 举报

袁淳雅 2013-11-11 11:05:08
前排支持下
回复

使用道具 举报

乐观 2013-11-11 12:48:09
看帖要回,回帖才健康,在踩踩,楼主辛苦了!
回复

使用道具 举报

全雪戈 2024-10-20 18:58:34
占坑编辑ing
回复

使用道具 举报

柏嘉言 2024-11-22 22:48:19
我只是路过,不发表意见
回复

使用道具 举报

乐悦可 2024-11-23 12:03:38
站位支持
回复

使用道具 举报

晁霞文 2025-1-29 14:18:51
我擦!我要沙发!
回复

使用道具 举报

单于力 2025-2-27 19:49:05 来自手机
在撸一遍。。。
回复

使用道具 举报

荣思洁 2025-4-6 13:36:27
我也顶起出售广告位
回复

使用道具 举报

逄妍丽 2025-5-3 17:23:14
支持,赞一个
回复

使用道具 举报

于一璇 2025-5-8 10:00:10
发发呆,回回帖,工作结束~
回复

使用道具 举报

郎慧心 2025-5-22 21:57:29 来自手机
不错 支持下
回复

使用道具 举报

手机版

GMT+8, 2025-5-30 11:09

Copyright © 2012 技术派 | 技术支持:技术派设计

Powered by Discuz! X3.4