要更改哪一部分来加速此代码?代码到底在做什么?
__global_ void mat(Matrix a, Matrix b)
{
int[] tempData = new int[2];
tempData[0] = threadIdx.x ;
tempData[1] = blockIdx.x * blockDim;
b.elements[tempData[1] + tempData[0]] = b.elements[tempData[1] + tempData[0]] * 5;
}
如果这就是所有有问题的代码,那么这就是愚蠢的:
int[] tempData = new int[2];
tempData[0] = threadIdx.x ;
tempData[1] = blockIdx.x * blockDim;
只需这样做:
__global__ void mat(Matrix a, Matrix b)
{
int tempData_0 = threadIdx.x ;
int tempData_1 = blockIdx.x * blockDim;
b.elements[tempData_1 + tempData_0] = b.elements[tempData_1 + tempData_0] * 5;
}
构造tempdata[0] + tempdata[1]
正在有效地创建规范的 CUDA 1D 全局唯一线程索引:
int idx = threadIdx.x+blockDim.x*blockIdx.x;
通过构建的索引,您的主要代码是:
b.elements[idx] = b.elements[idx] * 5;
它获取向量(或矩阵,其中行或列连续存储)的元素并将它们乘以 5。
按照我为您提供的大纲,您的代码可能可以进一步简化以使其更易于阅读idx
,但这些更改不会产生显着的性能差异。编译器可以计算出这些类型的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)