所以在一些代码的CPU版本的那一刻,我有一个类似如下的东西:如何在GPU上使用CULA 3D矩阵?
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上,因为它们不会改变,但我不知道该怎么做。或者我可以如何在一般情况下存储数组,以便这是可能的..
我已经在网上看到有关使用3D矩阵与CUDA的各种事情,但他们似乎不太适用于能够然后进行CULA函数的函数调用秒。
无论如何..我真的不知道最好的方式去做这件事,任何人有任何想法?
好,在回答下面的例子中,我有这样的:
extern "C" void copyFNFVecs_(double **FNFVecs, int numpulsars, int numcoeff){
cudaError_t err;
err = cudaMalloc((void ***)&GlobalFVecs_d, numpulsars*sizeof(double*));
checkCudaError(err);
for(int i =0; i < numpulsars;i++){
err = cudaMalloc((void **) &(GlobalFVecs_d[i]), numcoeff*numcoeff*sizeof(double));
checkCudaError(err);
// err = cudaMemcpy(GlobalFVecs_d[i], FNFVecs[i], sizeof(double)*numcoeff*numcoeff, cudaMemcpyHostToDevice);
// checkCudaError(err);
}
}
我在那里宣布双** GlobalFVecs_d是一个全球性的..但我得到一个赛格故障,当它击中行
err = cudaMalloc((void **) &(GlobalFVecs_d[i]), numcoeff*numcoeff*sizeof(double));
但它似乎正是在另一个例子中是什么?
EDIT2:
好吧,我意识到这是不一样的,所以我现在已经编译,用代码:
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);
}
它在这里seg错误,而不是如何获取数据?
你解决了吗? – KiaMorot