我試圖找到一些本地子陣列的最大絕對值。嘗試將原始值共享給其他處理器時會出現問題,因為該值必須保留其原始符號(正號或負號)
所以我有這個結構:
struct max_data
{
int index;
double real_value, absolute_value;
};
查找最大絕對值的函式:
struct max_data find_max_absolute(double vec[], int size)
{
double max = absolute(vec[0]), current = 0;
int position = 0;
struct max_data a;
for (int i = 1; i < size; i )
{
current = absolute(vec[i]);
if (current > max)
{
position = i;
max = current;
}
}
a.index = position;
a.real_value = vec[position];
a.absolute_value = max;
return a;
}
在 main 中,我使用了以下代碼:
// ...
struct max_data local_max_data = find_max_data(local_result, size);
local_max_value = local_max_data.absolute_value;
MPI_Allreduce(&local_max_value, &max_value, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
我可以創建自定義操作或資料型別嗎?
uj5u.com熱心網友回復:
您需要定義一個自定義歸約運算子。
void abs_max(void *in,void *inout,int *len,MPI_Datatype *type) {
// r is the already reduced value, n is the new value
float n = *(float*)in, r = *(float*)inout;
float m;
if (fabs(n)>fabs(r))
m = n;
else m = r;
#ifdef DEBUG
printf("combine %e %e : %d\n",r,n,m);
#endif
*(float*)inout = m;
}
然后您將其用作:
MPI_Op calc_absmax;
MPI_Op_create(abs_max,1,&calc_absmax);
MPI_Allreduce(&data,&data_abs_max,1,MPI_FLOAT,calc_absmax,comm);
MPI_Op_free(&calc_absmax);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364042.html
上一篇:前處理器:宏只展開一次
下一篇:檢查陣列中是否已經給出了數字
