Хобрук: Ваш путь к мастерству в программировании

CUDA – Как поменять местами указатели массива устройств?

Я написал функцию swap для удобного обмена указателями массива устройств, но она не работает, я предполагаю, что я меняю местами указатели локального массива в функции подкачки, а не те, которые я ей передаю.

__global__ void device_add_one(float *A, float *B)
{
    for (int index = blockIdx.x * blockDim.x + threadIdx.x;
         index < N;
         index += blockDim.x * gridDim.x)
    {
        // just for the example
         B[index] = A[index] + 1;
    {
}

void swap(float *a, float *b)
{
    float *temp = a;
    a = b;
    b = temp;
}

void loop(float *host_array, int size, int loops)
{
    cudaMalloc(&A, (size * sizeof(float));
    cudaMalloc(&B, (size * sizeof(float));

    cudaMemcpy(A, host_array, (size * sizeof(float), cudaMemcpyHostToDevice);

    for (int i = 0; i < loops; i++) {
        device_add_one<<< 1, 254 >>>(A, B);

        // swap pointers like this does not work
        swap(A, B);

        /* This works:
        float *temp = a;
        a = b;
        b = temp;
        */
    }

    cudaMemcpy(host_array, A, (size * sizeof(float), cudaMemcpyDeviceToHost);
}
11.08.2017

  • Ваш первый метод будет работать. здесь один пример, и есть другие. Вы не показали полный код и не объяснили, почему, по вашему мнению, он не работает, поэтому не знаете, что здесь сказать. Когда вы говорите, что что-то не работает, вы должны предоставить минимально воспроизводимый пример. 11.08.2017
  • На первый взгляд, текущее решение (перестановка указателей в цикле) должно работать, а в чем оно не работает? 11.08.2017
  • Ваш опубликованный код содержит множество синтаксических ошибок. Вы не могли бы скомпилировать этот код. Если различные синтаксические ошибки исправлены, а соответствующая функция main и другие определения предоставлены по мере необходимости, показанный вами код работает нормально в соответствии с моим тестированием. На этот вопрос в этом состоянии практически невозможно ответить, и SO предоставляет причину голосования за закрытие специально для этого случая. 11.08.2017
  • @RobertCrovella Я нашел ошибку, я обновляю код, чтобы включить ее, но мне нужна помощь с решением. Пожалуйста, дайте мне минуту. 11.08.2017
  • cplusplus.com/reference/algorithm/swap 12.08.2017

Ответы:


1

Ваш метод вызова функции для замены указателей не работает, потому что вы используете передачу по значению. Это обычная концепция программирования на C/C++, не уникальная для CUDA.

Когда вы передаете переменные (включая в данном случае указатели) функции по значению:

void swap(float *a, float *b)

механизм передачи C по значению создает локальную копию аргументов функции для использования в теле функции. Изменения этих аргументов не отображаются в контексте вызова. Чтобы обойти это, простым подходом будет передача по ссылке (в C++):

void swap(float* &a, float* &b)

Вот рабочий пример:

$ cat t393.cu
#include <stdio.h>

const int N = 1000;
float *A, *B;

__global__ void device_add_one(float *A, float *B)
{
    for (int index = blockIdx.x * blockDim.x + threadIdx.x;
         index < N;
         index += blockDim.x * gridDim.x)
    {
        // just for the example
         B[index] = A[index] + 1;
    }
}
void swap(float* &a, float* &b){
  float *temp = a;
  a = b;
  b = temp;
}

void loop(float *host_array, int size, int loops)
{
    cudaMalloc(&A, size * sizeof(float));
    cudaMalloc(&B, size * sizeof(float));

    cudaMemcpy(A, host_array, (size * sizeof(float)), cudaMemcpyHostToDevice);

    for (int i = 0; i < loops; i++) {
        device_add_one<<< 1, 254 >>>(A, B);

        // swap pointers
        swap(A, B);
        //float *temp = A;
        //A = B;
        //B = temp;
    }

    cudaMemcpy(host_array, A, (size * sizeof(float)), cudaMemcpyDeviceToHost);
}

int main(){

  float *data = (float *)malloc(N*sizeof(float));
  for (int i = 0; i<N; i++) data[i] = i & 3;  // fill with 0 1 2 3 0 1 2 3...
  loop(data, N, 100);
  for (int i = 0; i<20; i++) printf("%f ", data[i]);
  printf("\n");
  return 0;
}
$ nvcc -arch=sm_61 -o t393 t393.cu
$ cuda-memcheck ./t393
========= CUDA-MEMCHECK
100.000000 101.000000 102.000000 103.000000 100.000000 101.000000 102.000000 103.000000 100.000000 101.000000 102.000000 103.000000 100.000000 101.000000 102.000000 103.000000 100.000000 101.000000 102.000000 103.000000
========= ERROR SUMMARY: 0 errors
$
11.08.2017
Новые материалы

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании