当前位置: 首页 > news >正文

中国铁路总公司建设管理部网站百度关键词seo优化

中国铁路总公司建设管理部网站,百度关键词seo优化,聊城网站制作价格,中国做b2b外贸的网站矩阵乘可以利用gpu多线程并行的特点进行加速计算,但是传统简单的方法需要多次读取数据到寄存器中,增加耗时,因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性,结合tiling技术进行加速计算。 理论部分不解释了&#…

矩阵乘可以利用gpu多线程并行的特点进行加速计算,但是传统简单的方法需要多次读取数据到寄存器中,增加耗时,因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性,结合tiling技术进行加速计算。
理论部分不解释了,网上有很多,关键在于网上很多利用共享内存计算的代码存在错误(大部分只有在设置blockDim.x == blockDim.y 的时候,凑巧能对齐index给出正确的结果,若这俩不等,结果就错了),这里给出一个修正的版本:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <assert.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"#define M 32
#define K 32
#define N 32void initial(float *array, int size)
{for (int i = 0; i < size; i++){array[i] = (float)(1);}
}void printMatrix(float *array, int row, int col)
{float *p = array;for (int y = 0; y < row; y++){for (int x = 0; x < col; x++){printf("%.2f ", p[x]);}p = p + col;printf("\n");}return;
}__global__ void multiplicateMatrixOnDevice(float *array_A, float *array_B, float *array_C, int M_p, int K_p, int N_p)
{int ix = threadIdx.x + blockDim.x*blockIdx.x;//row numberint iy = threadIdx.y + blockDim.y*blockIdx.y;//col numberif (ix < N_p && iy < M_p){float sum = 0;for (int k = 0; k < K_p; k++){sum += array_A[iy*K_p + k] * array_B[k*N_p + ix];}array_C[iy*N_p + ix] = sum;}
}// Compute C = A * B
//  M, K, K, N, M, N
__global__ void matrixMultiplyShared(float *A, float *B, float *C,int numARows, int numAColumns, int numBRows, int numBColumns, int numCRows, int numCColumns)
{//@@ Insert code to implement matrix multiplication here//@@ You have to use shared memory for this MP// 1. 相比网上代码,修改这里的index__shared__ float sharedM[8][16];  __shared__ float sharedN[16][8];  int bx = blockIdx.x;  int by = blockIdx.y; int tx = threadIdx.x; int ty = threadIdx.y; int row = by * blockDim.y + ty;     int col = bx * blockDim.x + tx;     float Csub = 0.0;// for (int i = 0; i < 2; ++i)     for (int i = 0; i < (int)(ceil((float)numAColumns / blockDim.x)); i++){if (i*blockDim.x + tx < numAColumns && row < numARows)sharedM[ty][tx] = A[row*numAColumns + i*blockDim.x + tx];elsesharedM[ty][tx] = 0.0;// 2. 相比网上代码,修改这里的indexif (i*blockDim.x + tx < numBRows && col < numBColumns)sharedN[tx][ty] = B[(i*blockDim.x + tx)*numBColumns + col];elsesharedN[tx][ty] = 0.0;__syncthreads();// if (blockIdx.x == 0 && blockIdx.y == 1 && threadIdx.x == 0 && threadIdx.y ==0 ) {//     printf("sharedM: \n");//     for (int i = 0; i < 8; ++i) {//         for (int j = 0; j < 16; ++j) {//             printf("%f ", sharedM[i][j]);//         }//         printf("\n");//     }//     printf("sharedN: \n");//     for (int i = 0; i < 16; ++i) {//         for (int j = 0; j < 8; ++j) {//             printf("%f ", sharedM[i][j]);//         }//         printf("\n");//     }// }for (int j = 0; j < blockDim.x; j++)// 3. 相比网上代码,修改这里的indexCsub += sharedM[ty][j] * sharedN[j][ty];__syncthreads();}if (row < numCRows && col < numCColumns)C[row*numCColumns + col] = Csub;}int main(int argc, char **argv)
{clock_t start = 0, finish = 0;float time;int Axy = M * K;int Bxy = K * N;int Cxy = M * N;float *h_A, *h_B, *hostRef, *deviceRef;h_A = (float*)malloc(Axy * sizeof(float));h_B = (float*)malloc(Bxy * sizeof(float));int nBytes = M * N * sizeof(float);hostRef = (float*)malloc(Cxy * sizeof(float));deviceRef = (float*)malloc(Cxy * sizeof(float));initial(h_A, Axy);initial(h_B, Bxy);// printMatrix(h_A, M, K);float *d_A, *d_B, *d_C;cudaMalloc((void**)&d_A, Axy * sizeof(float));cudaMalloc((void**)&d_B, Bxy * sizeof(float));cudaMalloc((void**)&d_C, Cxy * sizeof(float));cudaMemcpy(d_A, h_A, Axy * sizeof(float), cudaMemcpyHostToDevice);cudaMemcpy(d_B, h_B, Bxy * sizeof(float), cudaMemcpyHostToDevice);int dimx = 16;int dimy = 16;dim3 block(dimx, dimy);dim3 grid((M + block.x - 1) / block.x, (N + block.y - 1) / block.y);cudaEvent_t gpustart, gpustop;float elapsedTime = 0.0;cudaEventCreate(&gpustart);cudaEventCreate(&gpustop);cudaEventRecord(gpustart, 0);// multiplicateMatrixOnDevice<<<grid,block>>> (d_A, d_B, d_C, M, K, N);matrixMultiplyShared << < grid, block >> > (d_A, d_B, d_C, M, K, K, N, M, N);cudaDeviceSynchronize();cudaEventRecord(gpustop, 0);cudaEventSynchronize(gpustop);cudaEventElapsedTime(&elapsedTime, gpustart, gpustop);cudaEventDestroy(gpustart);cudaEventDestroy(gpustop);cudaMemcpy(deviceRef, d_C, Cxy * sizeof(float), cudaMemcpyDeviceToHost);printMatrix(deviceRef, M, N);return 0;
}
http://www.yidumall.com/news/39599.html

相关文章:

  • 携程旅行网站内容的建设长沙网
  • 深圳装修公司网站seo优化主要做什么
  • 专业网站建设推广seo博客网站
  • 网站建设服务费合同百度信息流推广
  • 360建筑网现在叫什么郑州seo优化顾问
  • 做网站ppt百度经验怎么赚钱
  • 网站建设优化公司呼和浩特全国最新疫情实时状况地图
  • 网站seo解决方案it培训机构哪家好
  • 制作网站banner百度一下你就知道 官网
  • 室内设计网站推荐知乎广告代理
  • 建德网站建设公司免费网站推广软件哪个好
  • 做自媒体与做网站免费发布推广的平台有哪些
  • 自己做网站卖视频营销比较好的知名公司有哪些
  • 合肥做网站工作室百度一下浏览器下载安装
  • 做网站天通苑萧山市seo关键词排名
  • 做的网站访问不了成都百度推广代理公司
  • 已认证网站服务费怎么做谷歌官方seo入门指南
  • 外贸网站建设与优化百度站长平台如何添加网站
  • 先域名 还是先做网站网络营销名词解释答案
  • 中小互联网企业有哪些河南seo关键词排名优化
  • 网站注册了域名然后怎么做seo招聘要求
  • 长安网站建设定制三门峡网站seo
  • 原生态旅游网站开发需求分析seo优化排名公司
  • 上海制作网站公司网站如何做网站推广广告
  • 定州哪里可以做网站任务推广引流平台
  • javhd720p wordpressseo广告优化
  • 有什么网站是做平面设计的培训网站制作
  • 大连学网站制作网站seo关键词排名
  • 科技网站导航品牌推广
  • 望野王维网站排名优化公司