所以这是一个后续的问题,我有,在一些代码的CPU版本的那一刻,我有一个类似如下的东西:访问向量
for(int i =0;i<N;i++){
dgemm(A[i], B[i],C[i], Size[i][0], Size[i][1], Size[i][2], Size[i][3], 'N','T');
}
其中A [i]将是一些尺寸的二维矩阵。
我希望能够做到这一点,使用CULA一个GPU(我不只是在做乘法,所以我需要在CULA线性代数操作),因此,例如:
for(int i =0;i<N;i++){
status = culaDeviceDgemm('T', 'N', Size[i][0], Size[i][0], Size[i][0], alpha, GlobalMat_d[i], Size[i][0], NG_d[i], Size[i][0], beta, GG_d[i], Size[i][0]);
}
但我希望在程序开始时将我的B存储在GPU上,因为它们不会改变,所以我需要一个包含指向组成我的B的向量集的指针的向量。
目前,我有以下代码编译:
double **GlobalFVecs_d;
double **GlobalFPVecs_d;
extern "C" void copyFNFVecs_(double **FNFVecs, int numpulsars, int numcoeff){
cudaError_t err;
GlobalFPVecs_d = (double **)malloc(numpulsars * sizeof(double*));
err = cudaMalloc((void ***)&GlobalFVecs_d, numpulsars*sizeof(double*));
checkCudaError(err);
for(int i =0; i < numpulsars;i++){
err = cudaMalloc((void **) &(GlobalFPVecs_d[i]), numcoeff*numcoeff*sizeof(double));
checkCudaError(err);
err = cudaMemcpy(GlobalFPVecs_d[i], FNFVecs[i], sizeof(double)*numcoeff*numcoeff, cudaMemcpyHostToDevice);
checkCudaError(err);
}
err = cudaMemcpy(GlobalFVecs_d, GlobalFPVecs_d, sizeof(double*)*numpulsars, cudaMemcpyHostToDevice);
checkCudaError(err);
}
,但如果我现在试着和访问它:
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid;//((G + dimBlock.x - 1)/dimBlock.x,(N + dimBlock.y - 1)/dimBlock.y);
dimGrid.x=(numcoeff + dimBlock.x - 1)/dimBlock.x;
dimGrid.y = (numcoeff + dimBlock.y - 1)/dimBlock.y;
for(int i =0; i < numpulsars; i++){
CopyPPFNF<<<dimGrid, dimBlock>>>(PPFMVec_d, GlobalFVecs_d[i], numpulsars, numcoeff, i);
}
在这里赛格故障,这是不如何在获得数据?
那我打电话籽粒功能就是:
__global__ void CopyPPFNF(double *FNF_d, double *PPFNF_d, int numpulsars, int numcoeff, int thispulsar) {
// Each thread computes one element of C
// by accumulating results into Cvalue
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
int subrow=row-thispulsar*numcoeff;
int subcol=row-thispulsar*numcoeff;
__syncthreads();
if(row >= (thispulsar+1)*numcoeff || col >= (thispulsar+1)*numcoeff) return;
if(row < thispulsar*numcoeff || col < thispulsar*numcoeff) return;
FNF_d[row * numpulsars*numcoeff + col] += PPFNF_d[subrow*numcoeff+subcol];
}
什么我不这样做对吗?注意,最后我还想做第一个例子,在每个GlobalFVecs_d [i]上调用cula函数,但现在甚至都不行。
您认为这是做这件事的最好方法吗?如果可以通过CULA函数,我可以做到这一点,但我不知道它是否支持。
干杯 林德利
感谢你的工作,并没有比我一直在做的事情快得多,它将一个大矩阵复制过来,然后为循环的每次迭代创建单个矩阵,但代码更清晰一些。 – LindleyLentati