GPU 编程第六次作业(实验七)
Posted 缙云山车神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU 编程第六次作业(实验七)相关的知识,希望对你有一定的参考价值。
1 实验步骤一
1.1 运行结果:
1.2 绘制图像
1.3 分析原因
就和这个图表现出的是一样的
图一的访问尽管会有位移,但总归是顺序连续的访问,所以可以通过Coalesce 进行少量的 memory transactions,位移是多少没什么差别
图二表示说,访问的位置越稀疏速度就越慢,因为一次 transaction 访问到的显存位置就变少,访问次数就增加,效率就低
2 实验步骤二
2.1 代码
__global__ void kernel_reverse_shared_mem(DTYPE *input, DTYPE *output, int n)
unsigned int i = blockDim.x*blockIdx.x+threadIdx.x;
if(i>=n) return;
__shared__ DTYPE data[BLOCK_SIZE];
data[BLOCK_SIZE-1-threadIdx.x]=input[i]; //逆序
__syncthreads();
unsigned int j=((n-1-i)/BLOCK_SIZE)*BLOCK_SIZE+threadIdx.x;
output[j]=data[threadIdx.x]; //顺序
2.2 实验结果
第六次作业
一、实验内容
1、实验要求:有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4倍,请找出一个这样的四位数。
代码:
#include<stdio.h> int main() { int a,b,c,d,e,f; for(a=1000;a<10000;a++) { b=a/1000; c=a%1000/100; d=a%1000%100/10; e=a%1000%100%10; f=e*1000+d*100+c*10+b; if((b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)&&a==(4*f)) { printf("原四位数为%d,新四位数为%d\\n",a,f); } } return 0; }
程序运行结果:
2.输入任意一个多位的数字,求各位数字之和。如果在【1,12】之内,则输出与和数字对应的月份的英文名称,否则输出***。
样例: 输入123, 输出 6 June
输入12345,输出 15 ***
代码:
#include<stdio.h> int main() { long a,sum=0; printf("请输入一个多位数\\n"); scanf("%ld",&a); while(a) { sum=sum+a%10; a/=10; } printf("%ld\\n",sum); switch(sum) { case 1:printf("January\\n");break; case 2:printf("February\\n");break; case 3:printf("March\\n");break; case 4:printf("April\\n");break; case 5:printf("May\\n");break; case 6:printf("June\\n");break; case 7:printf("July\\n");break; case 8:printf("August\\n");break; case 9:printf("September\\n");break; case 10:printf("October\\n");break; case 11:printf("November\\n");break; case 12:printf("December\\n");break; default:printf("***\\n");break; } return 0; }
程序运行结果:
3.给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:输入在一行中给出A。
输出格式:输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:2
输出样例:234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
代码:
#include<stdio.h> int main() { int a,b,c,d,sum=1,n=0; printf("给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。\\n"); scanf("%d",&a); if(a>=4) { printf("不存在\\n"); } else { for(b=a;b<6;b++) { for(c=a;c<6;c++) { for(d=a;d<6;d++) { if(b!=c&&b!=d&&c!=d) { sum=b*100+c*10+d; printf("%d%\\t",sum); n++; if(n%4==0) { printf("\\n"); } } } } } } return 0; }
程序运行结果:
4、自动出题
代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int a,b,result1,result2,answer1,answer2,d,n1,n2,n3=0,n4=0,y,Y,n; char x; char op1,op2; do { n2=0; for (n1=1;n1<=5;n1++) { srand(time(NULL)); a=rand()%100+1; b=rand()%100+1; d=rand()%4+1; switch (d) { case 1:op1=\'+\';result1=a+b;break; case 2:op1=\'-\';result1=a-b;break; case 3:op1=\'*\';result1=a*b;break; case 4:op1=\'/\',op2=\'%\';result1=a/b,result2=a%b;break; } if (d==1||d==2||d==3) { printf("%d%c%d=?\\n",a,op1,b); printf("请输入答案\\n"); scanf("%d",&answer1); if (answer1==result1) { printf("你很棒,做对了!\\n"); n2++; } else { printf("做错了!,%d%c%d=%d\\n",a,op1,b,result1); } } else { printf("%d%c%d=?\\n",a,op1,b); printf("请分别输入商和余数,用空格分开\\n"); scanf("%d %d",&answer1,&answer2); if (answer1==result1&&answer2==result2) { printf("你很棒,做对了!\\n"); n2++; } else { printf("做错了!,%d%c%d=%d...%d\\n",a,op1,b,result1,result2); } } } n3=n3+n2; printf("本轮一共做对了%d道题,正确率是%.2f%%\\n",n2,(n2/5.0)*100); printf("输入y继续,输入n结束\\n"); scanf(" %c",&x); n4=n4+5; }while (x==\'y\'||x==\'Y\'); printf("本次一共做对了%d道题,正确率为%.2f%%",n3,((float)n3/n4)*100); return 0; }
程序运行结果:
附加题:
有16根火柴,可以拼出多少个形如“A+B=C”的等式,A、B、C是用火柴棍拼出的整数,且为一位数,输出该等式形式。
注意: 1. 加号与等号各自需要两根火柴棍 2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0) 3. 16根火柴棍必须全部用上
用火柴棍拼数字0-9的拼法如图所示:
代码:
#include<stdio.h> int main() { int x,y,z,X,Y,Z; for(x=0;x<=9;x++) { for(y=0;y<=9;y++) { for(z=0;z<=9;z++) { switch(x) { case 0:X=6;break; case 1:X=2;break; case 2:X=5;break; case 3:X=5;break; case 4:X=4;break; case 5:X=5;break; case 6:X=6;break; case 7:X=3;break; case 8:X=7;break; case 9:X=6;break; } switch(y) { case 0:Y=6;break; case 1:Y=2;break; case 2:Y=5;break; case 3:Y=5;break; case 4:Y=4;break; case 5:Y=5;break; case 6:Y=6;break; case 7:Y=3;break; case 8:Y=7;break; case 9:Y=6;break; } switch(z) { case 0:Z=6;break; case 1:Z=2;break; case 2:Z=5;break; case 3:Z=5;break; case 4:Z=4;break; case 5:Z=5;break; case 6:Z=6;break; case 7:Z=3;break; case 8:Z=7;break; case 9:Z=6;break; } if(x!=y&&x+y==z&&X+Y+Z==12) { printf("%d+%d=%d\\t",x,y,z); } } } } return 0; }
程序运行结果:
二、知识点总结(对顺序结构、选择结构、循环结构做综合总结)
1、分别利用枚举法和辗转相除法计算最大公因数。
2、未知循环次数可用while语句。
3、循环嵌套时要注意限制条件。
4、continue语句只能用在循环语句中。
5、分情况合理运用if与switch。
三、实验总结(实验中遇到的问题及解决方法)
1、等于用“==”符号,不是“=”。
2、switch语句中不要忘记break。
3、scanf有&而printf没有&
4、/10去掉最后一位,%10得到最后一位。
5、验证实验的合法性。
以上是关于GPU 编程第六次作业(实验七)的主要内容,如果未能解决你的问题,请参考以下文章