Nano Hash - криптовалюты, майнинг, программирование

Можно ли использовать тягу::device_vector и тягу::fill для 2D-массивов, используя библиотеку тяги в CUDA

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

Я должен знать, можно ли использовать thrust::device_vector или thrust::fill для инициализации и заполнения 2D-массивов.

Например:

// initialize 1D array with ten numbers in a device_vector 
    thrust::device_vector<int> D(10);

Можно ли дать..

thrust::device_vector<int> D[5][10];

и если это возможно, как я буду использовать функцию thrust::fill.

Моя цель — оптимизировать код с помощью библиотеки тяги.

28.03.2013

Ответы:


1

В STL и тяге вектор — это контейнер элементов данных, придерживающийся строгого линейная последовательность, поэтому по своей природе она в основном одномерна. По сути, эти элементы данных могут быть обычными типами и даже структурами и объектами, но не могут быть другими векторами (в отличие от STL).

Вы можете создать массив векторов, но операции над ними, как правило, должны выполняться один за другим для каждого вектора в массиве.

Что касается синтаксиса, вы не можете сделать это:

thrust::device_vector D[5][10];

Вы можете сделать что-то вроде этого:

thrust::device_vector<int> D[5][10];

Однако это создаст двумерный массив векторов, а это не то, что вам нужно, я не думаю.

Во многих случаях двумерные массивы можно «сгладить», чтобы обрабатывать их так, как если бы они были одномерными, и, не зная больше о вашей ситуации, я бы рекомендовал исследовать это. Если вы можете обращаться со своим двумерным массивом так, как если бы он был одномерным, возможно, с помощью индексации указателя, то вы можете заполнить все это, например, одним вызовом Thrust::fill.

Я бы также рекомендовал ознакомиться с кратким руководством по началу работы.

Вот рабочий пример, показывающий 2D-массив на хосте с элементарным сглаживанием:

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sequence.h>

#define H 5
#define W 10
__global__ void kernel(int *data, int row, int col) {

  printf("Element (%d, %d) = %d\n", row, col, data[(row*W)+col]);

}

int main(void)
{
    int h[H][W];
    thrust::device_vector<int> d(H*W);

    thrust::copy(&(h[0][0]), &(h[H-1][W-1]), d.begin());
    thrust::sequence(d.begin(), d.end());
    kernel<<<1,1>>>(thrust::raw_pointer_cast(d.data()), 2, 3);
    cudaDeviceSynchronize();

    return 0;
}
28.03.2013
  • Я. Спасибо за ответ. Можете ли вы предложить мне, как заполнить 2D-массив с помощью функции тяги :: fill. На самом деле у меня есть более 20 2D-массивов в глобальной памяти, к которым могут получить доступ все мои функции ядра. Я пользуюсь библиотекой тяги, чтобы уменьшить количество имеющихся у меня функций ядра, и вместо этого использую встроенные функции тяги. 29.03.2013
  • Вы читали краткое руководство по тяге, на которое я ссылался? Вместо thrust::sequence звонка, который у меня есть, вы могли бы сделать thrust::fill(d.begin(), d.end(), 27); 29.03.2013
  • да. Я попробовал и получил вывод для большинства кодов тяги в Visual Studio. Но я не нашел кода для 2D-массива. 01.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..