LINUX.ORG.RU

Cuda: передача структуры в константную память

 


0

1

Привет. Мне надо передать struct параметров в константную память. Эта структура содержит смесь int и float параметров.

Проблема: получаю всякую чушь.

Вопрос: Действительно ли в одной структуре могут быть только однотипные данные, или я чего-то не делаю, или я делаю что-то не так?

В описаниях я не встречал или не заметил такого ограничения.

Спасибо


Похоже причина не в типах. Вот что у меня есть. Структура:

struct SGAverPrm
{
    int _timeMod;  
    int _FC;       
    int _FN;
    int _tf;
};

Объявление структуры:

__constant__ SGAverPrm d_Cprms;

Копия тода и обратно:

    SGAverPrm prms;
    prms._timeMod = 11; 
    prms._tf = 22; 
    prms._FC = 33;  
    prms._FN = 44;
 
    myPrint("prms A",zpi2s("Mod",prms._timeMod),zpd2s("tf",prms._tf),z2i2s(prms._FC,prms._FN,"[]"));

    err = cudaMemcpyToSymbol (d_Cprms, &prms, sizeof(SGAverPrm), 0, cudaMemcpyHostToDevice);
  
    prms._timeMod = 0;
    prms._tf = 0;
    prms._FC = 0;
    prms._FN = 0;	                    //
    err = cudaMemcpyFromSymbol (&prms, d_Cprms, sizeof(SGAverPrm), 0, cudaMemcpyDeviceToHost);
 
    myPrint("prms B",zpi2s("Mod",prms._timeMod),zpd2s("tf",prms._tf),z2i2s(prms._FC,prms._FN,"[]"));

Запуск ядра:

    d_Average <<< 1, 1 >>>(&rb);

Копия после ядра:

    err = cudaDeviceSynchronize();
                                            
    prms._timeMod = 10;
    prms._tf = 10;
    prms._FC = 10;
    prms._FN = 10;	                    //
    err = cudaMemcpyFromSymbol (&prms, d_Cprms, sizeof(SGAverPrm), 0, cudaMemcpyDeviceToHost);

    myPrint("prms C",zpi2s("Mod",prms._timeMod),zpd2s("tf",prms._tf),z2i2s(prms._FC,prms._FN,"[]"));

Ядро:

__global__ void d_Average(bool* rb) {
    int tm = d_Cprms._timeMod;
    int fn = d_Cprms._FN;
    int fc = d_Cprms._FC;
    int tf = d_Cprms._tf;
    
        printf("___ d_Aver-AAA mod=%2d FNC=[%d,%d] fl=%d\n", blockIdx.x, threadIdx.x, tm, fn, fc, tf);

    return;
}

На выходе получаю:

prms A Mod=11    tf=22   [33,44]
prms B Mod=11    tf=22   [33,44]

___ d_Aver-AAA mod= 0 FNC=[0,11] fl=44

prms C Mod=11    tf=22   [33,44]

Снаружи все правильно, а внутри грязь.

Что это может быть?

ezus
() автор топика