C_and_CPP 板


LINE

※ 引述《tmbyksdG (雨神妹妹的男朋友)》之铭言: : 开发平台(Platform): (Ex: Win10, Linux, ...) : Linux上安装CUDA环境 (CUDA版本为8.0 运算能力为3.7)(Tesla K80) : 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) : NVCC : 额外使用到的函数库(Library Used): (Ex: OpenGL, ...) : 问题(Question): : 硬体方面: : 1.我执行deviceQuery侦测到2个device(device0:Tesla K80, device1:K80),估狗发现K80 : 是由两个GK210核心所组成,那我侦测到的device是指有两个K80(4个GK210)的意思吗? : 还是侦测到的两个device其实就是GK210? : 2.13个SMX,总共有2496个cores,所以我一次可以同时做运算的数量是否为2496个threads? : 软体方面: : 我写了一个64 * 64的矩阵乘法,我想测试不同的block & thread数量去做运算,哪个执 : 行时间会比较短,我试了两种block的配置(thread数量刚好为4096,一个thread执行一 : 个输出矩阵的一个element)。 : (1)dim3 dimBlock(32, 32); : dim3 dimGrid(2, 2); : 这个配置是以下附的程式码配置,执行结果是正常的。 : (2)dim3 dimBlock(4, 128); : dim3 dimGrid(1, 8); : 换成这样配置编译之後,结果却只有大约三分之一是正常的值,其余却都是0 : ,我的threadIdx.x & threadIdx.y都是由0-1023,请问这是发生了什麽错误吗? : 另外,我想知道执行运算时thread做了什麽事情,每个thread里面装的是什麽东西呢,是 : 我输入的资料吗?还是加跟乘这两个指令呢? : 喂入的资料(Input): : : ... : : 补充说明(Supplement): : 请版上的各位先进指导一下我,谢谢。另外,手机排版请见谅。 原文的code恕删 小弟刚好也在玩cuda,所以来试试看是不是能帮助到原Po,版上高手如云,还请多指教。 硬体部分的问题恕在下驽顿...(被巴头,不过你说的显卡上总共有几个core, 同时就可以有几个执行绪在执行这件事情是对的,不过要看你的 Grid, Block 参数 怎麽下,这个部分你必须先从你的显示卡的计算能力开始了解起,关键字:Warp。 如果参数下歪了,可能就会有一小段时间会有几个 core 在闲置,当然每台机器 最适合的参数都不一样,我自己也是还在摸索这个部分,这是我目前理解到的程度, ,如果有错误的地方还请高手指点。 再来软体方面我就熟悉多了,cuda真的是很困难debug,在下常常被indexing搞的 不要不要的。首先呢,你说你的 threadIdx.x, threadIdx.y 都是从 0 - 1023,这是 一个大问题,先假设你没有笔误,让我们来算算看,一个 Block 总共的 thread 数目 最多是 1024 (这个部分我不确定你的机器是否一样,所以你最好先了解一下),好 一般可以把一个 Block 想像成一个三维阵列的 thread,所以一个 Block 总共会有的 thread 数目是 x * y * z (x, y, z)各代表一个维度的执行绪总数,我们把你的 例子套进来,1024 * 1024 * 1,阿搭,这不是就爆了吗。所以你要确定你的 threadIdx 的 range到底是多少到多少。 再来你说你的输出有些值对,有些值不对,哈哈哈~哈威(再度被巴,这个问题 有好几种可能,第一,可能你从头到尾所有的 thread 只改到 output array 的其中 一部分,所以剩下的部份当然就是0啦,第二种可能,你某些的 Block access 了他 可以用的 memory 但是有些 Block 却没有(以为我又要唱歌了吗 威。这个状况下 除了你从 code 一行一行去检查之外,还有一个不错用的方式,不过我很好奇,既然 你都会用 cudaEvent_t 了,怎麽不会用这个: cudaError_t,这位大大就是你找错 的好夥伴,实作部分如下: cudaError_t status; MyKernel<<< grd, blk >>>( ... ); // 你的名字(X 你的kernel(O status = cudaGetLastError(); // 问问 cuda 大大我刚刚有没有做错什麽 if( status != cudaSuccess ){ // 如果我有做错 请告诉我错在哪 cout << cudaGetErrorName( status ) << ":" << cudaGetErrorString( status ); // exit(255); // 看个人决定要不要继续执行啦 } 使用上大致就是这样,我个人是会省去 cudaGetErrorName() 的部份,因为我比较懒惰, 原Po可以自己去玩玩看,在决定要怎麽使用,你有你自己的style。 这应该是第三个问题吧,想知道每个 thread 做了什麽,建议你自己玩玩看这个, 写一个 kernel 处理一个大小为 1024 的 array,然後只使用一个 Block 来玩,参数 就可以这样下 <<< 1, blk >>>, blk 可以是 1 - 1024 任何的数字。然後在里面让一 个 thread 只改一个 array element,array index 依据 threadIdx.x。这样你要他 做什麽都可以,最後把它输出出来自己看看就知道啦。剧透一下每个 thread 其实都 会执行你 kernel 的内容,不同的地方只在於 threadIdx, blockIdx 这些变数的值会 不一样。 回答的有点简略,不过希望能够帮到你。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.122.248
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1480757935.A.833.html
1F:→ opl164: 一个block内的thread最多是1024个 可是max dimension of 12/04 20:41
2F:→ opl164: a thread block是(1024,1024,64) 为什麽会这样? 12/04 20:42
3F:→ sunneo: 那只是在表示x,y,z个别的最大值,但仍得保持x*y*z<1024 12/04 21:00







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP