Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CUDA. Двойная точность, двойная точность на GPU 
:(
    Опции темы
Frenky86
Дата 30.3.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2009

Репутация: нет
Всего: нет



К специалистам по CUDA вопрос о двойной точности вычисслений.

Моя видиокарта не поддерживает двойной точности, поэтому пришлось её эмулировать. Так как у самого добиться существенных результатов добиться не получилось, хотелось бы попросить помощи у более опытных старших товарищей.
Почитав на форуме nVidia (http://forums.nvidia.com/index.php?showtopic=73067&st=0&gopid=524302&#entry524302) как это реализуется, попытался сделать нечто подобное. 
Тестовый пример самый простой (возведение числа в квадрат)
Моё ядро.
/* Kernel */
__global__ void square_elements(float2* in, float2* out, int N)
{
    int idx = blockIdx.x*blockDim.x+threadIdx.x;
    if ( idx < N) out[idx]=in[idx]*in[idx];
}

Моя mex-функция (CUDA заинтересовала для расчетов больших матриц на MatLab-е)
void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
{
    int i, j, m, n;
    double *data1, *data2;
    float2 *data1f, *data2f;
    
    /* on GPU */
    float2 *data1f_gpu, *data2f_gpu;
    
    mxClassID category;
    if (nrhs != nlhs)
        mexErrMsgTxt("The number of input and output arguments must be the same.");
    for (i = 0; i < nrhs; i++)
    {
        /* Find the dimensions of the data */
        m = mxGetM(prhs[i]);
        n = mxGetN(prhs[i]);
        
        /* Create an mxArray for the output data */
        plhs[i] = mxCreateDoubleMatrix(m, n, mxREAL);
        
        /* Create an input and output data array on the GPU*/
        cudaMalloc( (void **) &data1f_gpu,sizeof(float2)*m*n);
        cudaMalloc( (void **) &data2f_gpu,sizeof(float2)*m*n);
        
        /* Retrieve the input data */
        data1 = mxGetPr(prhs[i]);
        
        /* Check if the input array is single or double precision */
        category = mxGetClassID(prhs[i]);
        if( category == mxSINGLE_CLASS)
        {
            /* The input array is single precision, it can be sent directly to the
            card */
            cudaMemcpy( data1f_gpu, data1, sizeof(float)*m*n,
            cudaMemcpyHostToDevice);
        }
        if( category == mxDOUBLE_CLASS)
        {
            /* The input array is in double precision, it needs to be converted t
            floats before being sent to the card */
            data1f = (float2 *) mxMalloc(sizeof(float2)*m*n);
            for (j = 0; j < m*n; j++)
            {
                set(*data1f, *data1);
            }
            cudaMemcpy( data1f_gpu, data1f, sizeof(float)*n*m, cudaMemcpyHostToDevice);
        }
        data2f = (float2 *) mxMalloc(sizeof(float2)*m*n);
        
        /* Compute execution configuration using 128 threads per block */
        dim3 dimBlock(128);
        dim3 dimGrid((m*n)/dimBlock.x);
        if ( (n*m) % 128 !=0 ) dimGrid.x+=1;
        
        /* Call function on GPU */
        square_elements<<<dimGrid,dimBlock>>>(data1f_gpu, data2f_gpu, n*m);
        
        /* Copy result back to host */
        cudaMemcpy( data2f, data2f_gpu, sizeof(float)*n*m, cudaMemcpyDeviceToHost);
        
        /* Create a pointer to the output data */
        data2 = mxGetPr(plhs[i]);
        
        /* Convert from single to double before returning */
        for (j = 0; j < m*n; j++)
        {
            data2[j] = data2f[j].x + data2f[j].y;    
        }        
        /* Clean-up memory on device and host */
        mxFree(data1f);
        mxFree(data2f);
        cudaFree(data1f_gpu);
        cudaFree(data2f_gpu);
    }
}
Но вот прикол, разницы между ответом при использовании float и float2 нет почти никакой smile ...
Подскажите, что я делаю неверно

PM MAIL   Вверх
Dem_max
Дата 30.3.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Используй фортран для вычислений.  smile 

Это сообщение отредактировал(а) Dem_max - 30.3.2009, 15:19


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Frenky86
Дата 31.3.2009, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2009

Репутация: нет
Всего: нет



Всем спасибо, вопрос решен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0393 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.