Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MPI_isCaterv()问题中设置置换数组_C++_Mpi - Fatal编程技术网

C++ 在MPI_isCaterv()问题中设置置换数组

C++ 在MPI_isCaterv()问题中设置置换数组,c++,mpi,C++,Mpi,嘿,我在MPI_isCaterv()函数中设置置换数组时遇到问题 我需要将部分图片分散到不同的进程中。我创建了自己的MPI_数据类型: private: MPI_Datatype createMPI_PixelType(){ MPI_Datatype new_type; int count = 3; int blocklens[] = { 1,1,1 }; MPI_Aint indices[3]; indices[0] = (MPI_Aint)offsetof(struct Pixel, R

嘿,我在MPI_isCaterv()函数中设置置换数组时遇到问题

我需要将部分图片分散到不同的进程中。我创建了自己的MPI_数据类型:

private: MPI_Datatype createMPI_PixelType(){
MPI_Datatype new_type;

int count = 3;
int blocklens[] = { 1,1,1 };

MPI_Aint indices[3];
indices[0] = (MPI_Aint)offsetof(struct Pixel, Red);
indices[1] = (MPI_Aint)offsetof(struct Pixel, Green);
indices[2] = (MPI_Aint)offsetof(struct Pixel, Blue);

MPI_Datatype old_types[] = { MPI_INT, MPI_INT, MPI_INT };

MPI_Type_create_struct(count, blocklens, indices, old_types, &new_type);
MPI_Type_commit(&new_type);

return new_type;}
像素结构

struct Pixel {
int Red;
int Green;
int Blue; }
作为函数参数,我需要传递置换数组。 我对它的理解是,每个进程从指定为disp[proc_id]的不同位置开始读取sendBuffer。例如,进程0 disp=0, 进程1 disp=0元素的大小, 进程2 disp=1+0元素等的大小。 这是代码

...
    //specify arrays for scathering
    sendCountArray = calcSendCounts(workTable);
    displacementArray = calcDisplacementArray(workTable);

    Pixel *fullPicture = pictureToPixelsArray();
    cout << endl;
    for (int i = 0; i < pixelsOnPicture; i++) {
        cout <<
            " r:" << fullPicture[i].Red <<
            " g:" << fullPicture[i].Green <<
            " b:" << fullPicture[i].Blue << endl;
    }

    cout << endl << "sendArray:" << endl;
    for (int i = 0; i < worldSize; i++) {
        cout << "i:" << i << " " << sendCountArray[i] << endl;
    }
    cout << endl <<  "displacementArray:" << endl;
    for (int i = 0; i < worldSize; i++) {
        cout << "i:" << i << " " << displacementArray[i] << endl;
    }
}
cout << endl; 
//
MPI_Scatter(sendCountArray, 1, MPI_INT, &pixelsSizeBuffer, 1, MPI_INT, 0, MPI_COMM_WORLD);

//sending part of picture
MPI_Request request;
MPI_Datatype mMPI_PIXEL = createMPI_PixelType();
partPicture = new Pixel[pixelsSizeBuffer];
MPI_Iscatterv(pictureToPixelsArray(), sendCountArray, displacementArray, mMPI_PIXEL, partPicture, pixelsSizeBuffer, mMPI_PIXEL, 0, MPI_COMM_WORLD, &request);
for (int i = 0; i < pixelsSizeBuffer; i++) {
    cout << "proc:" << procID <<
        " r:" << partPicture[i].Red <<
        " g:" << partPicture[i].Green <<
        " b:" << partPicture[i].Blue << endl;
}

前2个元素已正确发送。

您尚未等待请求,因此无法保证在检查输出时ISCATERV已完成。调用plain old Scatterv将确保在调用后完成,这样您就可以检查是否正确设置了所有参数和数据类型。或者在调用isCaterv之后添加一个MPI_Wait(&request),但是请注意,您在这里所做的只是重新实现阻塞调用

pixelsOnPicture:9
workTableSize: 6

 r:255 g:242 b:0
 r:63 g:72 b:204
 r:237 g:28 b:36
 r:0 g:162 b:232
 r:163 g:73 b:164
 r:63 g:11 b:15
 r:34 g:177 b:76
 r:255 g:242 b:0
 r:63 g:10 b:16

sendArray:
i:0 2
i:1 2
i:2 2
i:3 1
i:4 1
i:5 1

displacementArray:
i:0 0
i:1 2
i:2 4
i:3 6
i:4 7
i:5 8

proc:4 r:-842150451 g:-842150451 b:-842150451
proc:0 r:255 g:242 b:0
proc:2 r:-842150451 g:-842150451 b:-842150451
proc:5 r:-842150451 g:-842150451 b:-842150451
proc:0 r:63 g:72 b:204
proc:2 r:-842150451 g:-842150451 b:-842150451
proc:1 r:-842150451 g:-842150451 b:-842150451
proc:3 r:-842150451 g:-842150451 b:-842150451
proc:1 r:-842150451 g:-842150451 b:-842150451