Как использовать OpenACC для вычисления множества Мандельброта? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь научиться использовать OpenACC и для начала я внедряю его в простой код для вычисления набора Мандельброта, но при компиляции кода я получаю ошибки.

Я нашел это

В OpenACC должна быть ошибка обычной информации

и подумал, что это будет легко использовать в моем коде, но, похоже, это не сработает.

Это те процедуры, на которых я хочу использовать OpenACC, и то, что я пробовал

#pragma acc parallel loop copyout(color)

for (int i=0;i<=n0x;i++)
{

Cx=Re_start+dx*i;

  #pragma acc loop

    for (int h=0;h<=n0y;h++)
    {

    Cy=Im_start+dy*h;
    Zx1=0.;
    Zy1=0.;

    #pragma acc loop

        for(int k=0;k<=n;k++ && mod<=4.)
        { 


        Zx=Zx1*Zx1-Zy1*Zy1+Cx;
        Zy=2*Zx1*Zy1+Cy;
        Zx1=Zx;
        Zy1=Zy; 

        mod=(Zx*Zx+Zy*Zy);

            if(mod<=4.)
            {

            if(k==n) 
            color[i][h]=-1; 


            color[i][h]=k+1;

            }

        }  

    }

}

Я получаю сообщение об ошибке (я компилирую, используя pgc++ -acc splot.cpp -Minfo=accel)

PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Unknown variable reference (splot.cpp: 48)
main:
     48, Generating copyout(color[:][:])
         Generating Tesla code
         52, #pragma acc loop gang /* blockIdx.x */
         59, #pragma acc loop seq
         68, #pragma acc loop vector(128) /* threadIdx.x */
     52, Accelerator restriction: scalar variable live-out from loop: color
     59, Loop is parallelizable
         Accelerator restriction: scalar variable live-out from loop: color
     68, Loop is parallelizable
         Accelerator restriction: scalar variable live-out from loop: color
PGCC-F-0704-Compilation aborted due to previous errors. (splot.cpp)
PGCC/x86-64 Linux 19.4-0: compilation aborted

Что мне нужно изменить, чтобы иметь возможность правильно компилировать и запускать мой код?

1 Ответ

1 голос
/ 11 июня 2019

Проблема в том, что "&& mod <= 4.0" in для (int k = 0; k <= n; k ++ && mod <= 4.) ".Составные выражения в циклах for - это известное ограничение PGI, которое в настоящее время недоступно при генерации кода устройства. </p>

Удаление «&& mod <= 4.0» поможет обойти проблему. </p>

Я могу податьотчет о проблеме, хотя мне неясно, почему этот фрагмент кода присутствует, поскольку он кажется посторонним.Можете ли вы объяснить намерение?

...