У меня есть вопрос, связанный с библиотекой ArrayFire и использованием памяти. Я реализовал некоторую программу на простом CUDA / C и ту же самую программу, используя ArrayFire, и программа CUDA / C намного быстрее (примерно в 5 раз быстрее, чем ArrayFire).
Я проверяю профилировщик Nvidia с обоими из них, и основное различие, которое я вижу, это операции memcpy, в случае ArrayFire есть много операций Memcpy, в другом случае только несколько в начале программы. Делая некоторые тесты, я обнаруживаю, что делаю что-то вроде:
f = f*q;
Будучи f, q массивы генерируют больше вызовов memcpy … я думаю, что это причина того, почему мой код ArrayFire не работает лучше. почему это происходит? откуда все это Memcpys? как я могу избежать этого?
***** // редактировать ////
фрагмент кода
void Adveccion(){
for(int i = 0; i< q ; i++){
f(span,span,span,i) = shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
}
}
f — четырехмерный массив. и у меня есть эта функция внутри другого для цикла. Если я изменю функцию как:
void Adveccion(){
for(int i = 0; i< q ; i++){
shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
}
}
профилировщик не показывает массовое использование memcpys. Думаю, моя проблема в том, чтобы найти правильный способ ввода новых значений в массивы … возможно, использование A = B, не самое лучшее, но мне все еще есть чему поучиться …
Спасибо за ваше внимание, на случай, если вам понадобится больше кода, чтобы помочь мне, просто дайте мне знать. Спасибо !
Задача ещё не решена.
Других решений пока нет …