C++ 加速Cuda计划

C++ 加速Cuda计划,c++,cuda,C++,Cuda,要更改哪个部分以加速此代码?代码到底在做什么 __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]] *

要更改哪个部分以加速此代码?代码到底在做什么

__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
给您的大纲,您的代码可能会简化得更简单,以便于阅读,但这些更改不会对性能产生显著影响。编译器可以计算出这些类型的转换。

顺便说一句,不使用参数a。您可以通过将此函数调用与上一个或下一个函数调用相结合(并在此处乘以5)来间接加速此代码,以减少b的读/写频率。