Ядро CUDA для сборки конечных элементов - PullRequest
0 голосов
/ 27 ноября 2011

У нас есть файл неструктурированной тетраэдрической сетки, содержащий следующий формат:

element-ID  nod1 nod2 nod3 nod4


    1            452  3434  322 9000

    2            2322   837 6673 2323

    .
    .
    .

300000

Мы разбили вышеупомянутую сетку для размера раздела 2048 каждый.Для каждого размера раздела 2048 содержится уникальное значение nod1 nod2 nod3 nod4, мы передаем 1 блок и 512 потоков с различным начальным индексом.

В файле cuda у нас есть

__global__ void calc(double d_ax,int *nod1,int *node2,int *nod3,int *nod4,int   start,int size)
{
    int n1,n2,n3,n4;     
    int i = blockIdx.x * blockDim.x + threadIdx.x + start;


    if ( i < size )
    {

        n1=nod1[i];
        n2=nod2[i];
        n3=nod3[i];
        n4=nod4[i];

        ax[n1] += some code;
        ax[n2] += some code;
        ax[n3] += some code;
        ax[n4] += some code;
    }
}

Мы вызываемядро как

calc<<<1,512>>>(d_ax,....,0,512);
calc<<<1,512>>>(d_ax,....,512,512);
calc<<<1,512>>>(d_ax,....,1024,512); 
calc<<<1,512>>>(d_ax,....1536,512);

приведенный выше код работает хорошо, но проблема в том, что мы получаем различные результаты , используя более одного блока за раз.Например:

calc<<<2,512>>>(d_ax,....,0,1024); 
calc<<<2,512>>>(d_ax,....,1024,1024); 

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Я не уверен, что вы ожидаете, что кто-то скажет вам, что может быть не так, если код, который вы опубликовали, неполон и не компилируется, но если в вашем случае с одним блоком, вы действительно вызываете ядро ​​как вы написал, вот что должно произойти:

calc<<<1,512>>>(d_ax,....,0,512);    // process first 512 elements
calc<<<1,512>>>(d_ax,....,512,512);  // start >= 512, size == 512, does nothing
calc<<<1,512>>>(d_ax,....,1024,512); // start >= 1024, size == 512, does nothing
calc<<<1,512>>>(d_ax,....1536,512);  // start >= 1536, size == 512, does nothing

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

Если вы хотите получить лучший ответ, отредактируйте ваш вопрос так, чтобы он содержал полное описание проблемы и краткий, полный код, который можно было бы скомпилировать. В противном случае это примерно столько, сколько кто-либо может догадаться по предоставленной вами информации.

0 голосов
/ 27 ноября 2011

Для каждого размера раздела 2048 содержатся уникальные значения nod1 nod2 nod3 nod4

но в двух наборах разделов может появиться один и тот же индекс узла?Если в двух разных блоках у вас есть

Блок 1: ax[1234]=do something

Блок 2: ax[1234]=do something else

, он пахнет как состояние гонки.Вы никогда не знаете, какой из двух блоков будет быстрее писать ....

...