Использую CAL API
Копирую массивчики векторов по 4 элемента типа float: ширина=8192, высота=1024.
Скорость =50Мб/сек
Если из цикла убрать собственно копирование(помечено комментами), то время исполнения
голого цикла уменьшается в 11 раз. Т.е. На этих 4 строчках быстродействие падает в 11 раз.
Аналогичная функция для записи в ГПУ честно работает на скорости 450Мб/сек.
Вопрос: "Что делать"?
Процесс примерно такой:
- ...
- float* fdata =NULL;
- CALuint pitch =0;
- calResMap((CALvoid**)&fdata, &pitch, resource, 0);
- ...
- int s_idx =0;
- int d_idx =0;
- for (int currHeight = 0; currHeight < height; ++currHeight)
- {
- for (int currWidth = 0; currWidth <width; ++currWidth)
- {
- int currDstCompCount =0;
- if((Component::x &dstComp) !=0)
- {
- dst[d_idx] =fdata[s_idx];//если убрать это, то скорость вырастает
- currDstCompCount++;
- }
- if((Component::y &dstComp) !=0)
- {
- dst[d_idx +currDstCompCount] =fdata[s_idx +1];//если убрать это, то скорость вырастает
- currDstCompCount++;
- }
- if((Component::z &dstComp) !=0)
- {
- dst[d_idx +currDstCompCount] =fdata[s_idx +2];//если убрать это, то скорость вырастает
- currDstCompCount++;
- }
- if((Component::w &dstComp) !=0)
- {
- dst[d_idx +currDstCompCount] =fdata[s_idx +3];//если убрать это, то скорость вырастает
- }
- d_idx +=dstCompCount;
- s_idx +=compCount;
- }
- s_idx += (pitch *compCount) -(width *compCount);
- }
- ...
- calResUnmap(resource);
- ...
Comments
Выставил в биосе Command Rate =1 для памяти, производительность подросла на ~4%.
Сделал оптимизацию для частного случая, когда записываются все компоненты сразу - код получился как в примере из СДК - запись - 500-550 Мб/сек, чтение - 95Мб/сек.
95Мб/сек - это просто убогая скорость. Из-за чего это происходит я не могу сказать. М.б. хронические кэш-промахи в ЦП, т.к. при уменьшении задержек производительность подросла.
ПС: ЦП - Атлон64 3800+, 2,4ГГц. ОЗУ - 3Гб ДДР2 на реальной частоте 600Мгц.
Драйвер выполняет функции map/unmap со скоростью 1,5Гб/сек.