69,371
社区成员
发帖
与我相关
我的任务
分享
void STRASSEN(arg)
struct thread_args *arg;
{
float **A12,**A21;
float **B12,**B21;
float **C11,**C12,**C21,**C22;
float **MM1,**MM2;
struct thread_args thread[7];
int i,j;
int n = arg->n;
int m = n/2;
if (n == TN) {
MATRIX_MULTIPLY(n,arg->A,arg->B,arg->C);
} else {
A12=(float **)malloc(m*sizeof(float *));
A21=(float **)malloc(m*sizeof(float *));
B12=(float **)malloc(m*sizeof(float *));
B21=(float **)malloc(m*sizeof(float *));
C11=(float **)malloc(m*sizeof(float *));
C12=(float **)malloc(m*sizeof(float *));
C21=(float **)malloc(m*sizeof(float *));
C22=(float **)malloc(m*sizeof(float *));
MM1=(float **)malloc(m*sizeof(float *));
MM2=(float **)malloc(m*sizeof(float *));
if (NULL==A12||NULL==A21||NULL==B12||NULL==B21){
_error(ERR_MEM);
}
if (NULL==C11||NULL==C12||NULL==C21||NULL==C22||NULL==MM1||NULL==MM2) {
_error(ERR_MEM);
}
for (i=0;i<m;i++) {
A12[i]=(float *)malloc(m*sizeof(float));
A21[i]=(float *)malloc(m*sizeof(float));
B12[i]=(float *)malloc(m*sizeof(float));
B21[i]=(float *)malloc(m*sizeof(float));
C11[i]=(float *)malloc(m*sizeof(float));
C12[i]=(float *)malloc(m*sizeof(float));
C21[i]=(float *)malloc(m*sizeof(float));
C22[i]=(float *)malloc(m*sizeof(float));
MM1[i]=(float *)malloc(m*sizeof(float));
MM2[i]=(float *)malloc(m*sizeof(float));
if (NULL==A12[i]||NULL==A21[i]||NULL==B12[i]||NULL==B21[i]||NULL==C11[i]||NULL==C12[i]||NULL==C21[i]||NULL==C22[i]||NULL==MM1[i]||NULL==MM2[i]) {
_error(ERR_MEM);
}
}
//省略计算各矩阵的步骤
// 分线程再次调用STRASSEN, 传入的参数thread[i]中包含了float **A,**B,**C,分别也是一个动态分配的二位数组
for (i = 0; i < 7; i++) {
pthread_t id;
if(pthread_create(&id,NULL,(void*)STRASSEN,(void*)&thread[i])) {
perror("pthread_create");
exit(1);
}
pthread_join(id,NULL);
}
//省略一些
for (i=0;i<m;i++) {
free(A12[i]);
free(A21[i]);
free(B12[i]);
free(B21[i]);
free(C11[i]);
free(C12[i]);
free(C21[i]);
free(C22[i]);
free(MM1[i]);
free(MM2[i]);
}
free(A12),free(A21),free(B12),free(B21);
free(C11),free(C12),free(C21),free(C22),free(MM1),free(MM2);
}
}
int get_mem_for_data(int x, int y, double*** data)
{
if(NULL == (*data = (double**)malloc(x*sizeof(double*))))return (-1);
for(int i = 0; i < x; i++)
(*data)[i] = (double*)malloc(y*sizeof(double));
static int k = 0;
printf("%d\n", k++);
return (0);
}
int main(int argc, char* argv[])
{
printf("Hello World!\n");
double** data[1000];
for(int i = 0; i < 1000; i++)
get_mem_for_data(100, 100, &data[i]);
data[999][99][99] = 1.0;
printf("%f\n", data[999][99][99]);
//释放内存你,略。
return 0;
}
调用了999次,也没问题啊?