C ++ Cuda производительность для двойных указателей - PullRequest
0 голосов
/ 30 декабря 2018

Мне наконец удалось сохранить в памяти двойной указатель, чтобы использовать его в cuda (код ниже), но я вижу, что это менее эффективно, чем если бы я сгладил матрицу, что не так уж и хорошо.

Некоторые предложения по экономии времени / памяти?

Я действительно хочу использовать динамический 2d массив.

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdlib.h>
#include <cstdio>

__global__ void fct(int **dev_c)
{
    int y = threadIdx.x;
    int x = threadIdx.y;
    dev_c[y][x] = 3;
}

int main(void)
{
    //Output Array
    int **cc = new int*[2];
    for (int i = 0; i < 2; i++)cc[i] = new int[2];
    //Host Array
    int ** h_c = (int **)malloc(2 * sizeof(int *));
    for (int i = 0; i < 2; i++) {
        cudaMalloc((void**)&h_c[i], 2 * sizeof(int));
    }
    //Devie array
    int ** d_c;
    cudaMalloc((void **)&d_c, 2 * sizeof(int *));
    cudaMemcpy(d_c, h_c, 2 * sizeof(int *), cudaMemcpyHostToDevice);


    dim3 d(2, 2);
    fct << <1, d >> > (d_c);

    for (int i = 0; i < 2; i++) {
        cudaMemcpy(cc[i], h_c[i], 2 * sizeof(int), cudaMemcpyDeviceToHost);
    }

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            printf("(%d,%d):%d\n", i, j, cc[i][j]);
        }
    }
    int x;
    std::cin >> x;
    delete[] h_c;
    delete[] d_c;
}

1 Ответ

0 голосов
/ 30 декабря 2018

Возможно, вы захотите использовать уплощенную матрицу с некоторыми приемами указателя:

int main() {
    const int size = 10;

    auto arr = new int*[size];
    arr[0] = new int[size * size];
    for(int i = 1; i < size; i++) {
        arr[i] = arr[0] + (i * size);
    }
}

Таким образом, вы все равно можете получить доступ к матрице с синтаксисом arr[x][y], но фактическая память является смежной (что нетолько быстрее выделить *, но быстрее получить доступ, учитывая предварительную выборку кеша вокруг той, которую вы хотите использовать).

* быстрее выделить size * size память один раз, чем выделятьsize раз size элементов.

Примечание: использование delete[] в памяти malloc означает неопределенное поведение .Не смешивайте new / new[] + delete / delete[] с malloc + free.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...