cuốn sách gpt4 ai đã làm

c - Sử dụng hiệu quả MPI_Allreduce

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:25:11 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi có một danh sách trên mỗi bộ xử lý phạm vi và những con số. Tôi muốn xác định những danh sách này phạm vi Số lượng tối đa của mỗi hàng trong .

nhập mô tả hình ảnh ở đây

Bốn danh sách đầu tiên mỗi bộ xử lý P0-P3 phạm vi. Danh sách màu đỏ chứa MPI_Allreduce Mỗi bộ xử lý sau đó sẽ nhận được giá trị tối đa cho mỗi hàng.

Đây là phiên bản hoạt động của mã của tôi:

#include 
#include
#include
#include

//#xác định KEY_MAX 100

cấu trúc typedef{
int myrank;
int số;
int *phạm vi;
} SubDomainKeyTree;

void compRange(SubDomainKeyTree *s, int myrank, int numprocs){
s->myrank = myrank;
s->numprocs = numprocs;

// Cấp phát bộ nhớ cho phạm vi (numprocs+1)
s->range = malloc((numprocs+1) * sizeof(int));
// Tính toán các giá trị phạm vi
for(int p=0; p<=numprocs; p++){
s->range[p] = rand()%100;
}

for(int p=0; pnumprocs; p++){
if(s->myrank == p){
for(int k=0; k<=s->numprocs; k++){
printf("Bộ xử lý %d: %d số ngẫu nhiên là %d\n", p, k, s->range[k]);
}
printf("\n");
}
}
}

void compDynRange(SubD *s){

int rangeForAll[s->numprocs+1];
//////////////////////////////////////
// Điều này không thực sự hiệu quả //
//////////////////////////////////////
for(int r=0; r<=s->numprocs; r++){
MPI_Allreduce(&s->range[r], &rangeForAll[r], 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
}

for(int p=0; pnumprocs; p++){
if(s->myrank == p){
for(int k=0; k<=s->numprocs; k++){
s->range[k] = rangeForAll[k];
printf("Bộ xử lý %d: %d số ngẫu nhiên sau MPI_Allreduce là %d\n", p, k, s->range[k]);
}
printf("\n");
}
}
}

int main(int argc, char **argv){

tên intLen;
tên bộ xử lý char[MPI_MAX_PROCESSOR_NAME];

int myrank; // Thứ hạng của bộ xử lý
int numprocs; // Số lượng tiến trình
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name(processorName,&nameLen);
MPI_Trạng thái trạng thái;

thời gian_t t;
srand((unsigned)time(NULL)+myrank*numprocs+nameLen);

SubD;
compRange(&s, myrank, numprocs);

compDynRange(&s);
MPI_Finalize();
return 0;
}

Vòng lặp for tôi đang sử dụng có vẻ rất kém hiệu quả đối với tôi. Ở đây tôi tính toán giá trị tối đa cho từng hàng của tất cả các danh sách một cách tuần tự.

Nhưng tôi có thể sử dụng mà không cần vòng lặp for MPI_Allreduce 吗?

Tôi đã thử sử dụng nó thay vì vòng lặp for không hoạt động.

MPI_Allreduce(&s->range, &rangeForAll, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);

Bất cứ ai có thể cho tôi một gợi ý về cách làm điều này?

câu trả lời hay nhất

Như đã được gợi ý trong các nhận xét, lỗi bạn gặp phải trong mã là bạn không truyền các mảng chứa bộ đệm gửi và nhận mà là một số gợi ý tới chúng. Tôi đoán lỗi chỉ xuất phát từ việc sử dụng ban đầu một phần tử (như &s->phạm vi[r]), điều này hoàn toàn chính xác, bằng cách xóa quyền truy cập chỉ mục (tức là &s->phạm vi) Điều này là sai.

Như đã đề cập trước đó, hãy sử dụng:

MPI_Allreduce(s->range, rangeForAll, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD)

Thế thôi. Tuy nhiên, vì bạn muốn đưa kết quả vào s->phạm vi Mảng thay vì tạm thời phạm viXaTất cả mảng, vì vậy tốt hơn hết là không xác định mảng sau và sử dụng MPI_IN_PLACE từ khóa làm tham số gửi, sử dụng s->phạm vi như nhận các tham số. Cuộc gọi trở thành:

MPI_Allreduce(MPI_IN_PLACE, s->phạm vi, s->numprocs+1, MPI_INT, MPI_MAX, MPI_COMM_WORLD)

s->phạm vi Hoạt động như một bộ đệm gửi và nhận. Vì vậy, kết quả cuối cùng sẽ được định vị sau khi gọi s->phạm vi đệm, bạn không cần phải sao chép một cách rõ ràng.

Về việc sử dụng hiệu quả MPI_Allreduce trong c - chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/41741488/

hai mươi bốn 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress