Рассчитать сумму 2 векторов, используя CUDA - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть простая задача, которую я не могу решить.Я получил 2 одномерных массива (называемых векторами), состоящих из 10 элементов.Каждый элемент массива содержит случайное положительное число.Цель состоит в том, чтобы использовать CUDA для вычисления суммы этих двух массивов каждого номера индекса (другими словами: Vector Sum [0] = Vector A [0] + Vector B [0], затем то же самое с 1,2 ...10)

Вот мой код (kernel.cu).Я знаю, что использую имена переменных с плавающей точкой для целочисленных типов данных.Это потому, что я изначально планировал сделать это для типов данных с плавающей запятой, но я не смог заставить проект работать вообще из-за несовместимости типов данных.Поправьте меня, если это возможно, используя для этого типы данных с плавающей запятой.

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>

__global__ void vecAdd_kernel(int *floatAr1gpu, int *floatAr2gpu, int *floatSumGPU, int The_N){
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < The_N) floatSumGPU[i] = floatAr1gpu[i] + floatAr2gpu[i];
}

int main() 
{
    const unsigned int arraySize = 10;
    int floatArray1[arraySize];
    int floatArray2[arraySize];
    int *floatAr1gpu = 0;
    int *floatAr2gpu = 0;
    int floatSum[arraySize];
    int *floatSumGPU = 0;

    for (int c = 0; c < arraySize; c++) {
        floatArray1[c] = (rand() % 10)+1;
        floatArray2[c] = (rand() % 10)+1;
    }
    //Put the data into the GPU now
    //                      V--- This is allocating GPU memory under that name and Variable
    cudaMalloc((void **)&floatArray1, sizeof(float)*arraySize);
    cudaMalloc((void **)&floatArray2, sizeof(float)*arraySize);
    cudaMalloc((void **)&floatSum, sizeof(float)*arraySize);

    //           CPU Memory    GPU Mem       Array size              Method
    cudaMemcpy(floatArray1, floatAr1gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);
    cudaMemcpy(floatArray2, floatAr2gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);

    // execute
    //         grid size, block size
    vecAdd_kernel << < 1, arraySize >> > (floatArray1, floatArray2, floatSum, arraySize);

    //Copy data back from GPU to RAM
    //          GPU Memory   CPU Mem       Array size               Method
    cudaMemcpy(floatSumGPU, floatSum, sizeof(float)*arraySize, cudaMemcpyDeviceToHost);

    // clean up
    cudaFree(floatArray1);
    cudaFree(floatArray2);
    cudaFree(floatSum);

    for (int cc = 0; cc < arraySize; cc++) {
        std::cout << "Result of array number " << cc << " = " << floatSum[cc] << std::endl;
    }
    std::cout << "Done. Press any key to exit." << std::endl;
    char key = std::cin.get();

    return 0;
}

Вот что я получаю в результате: Результат программы

Это то, что я хочудля достижения (используя CUDA): Результат программы

Что не так с кодом?Я установил точку останова для проверки этого массива здесь: содержимое массива

1 Ответ

0 голосов
/ 24 ноября 2018

Не слишком внимательно изучая ваш код: вполне вероятно, что вы где-то получаете ошибку CUDA, и вместо того, чтобы выходить и сообщать о ней, вы пытаетесь идти, как будто все прошло успешно.Не делай этого.cudaGetLastError() твой друг;или, еще лучше, прочитайте это:

Каков канонический способ проверки на ошибки с использованием API времени выполнения CUDA?

также вам следует использовать Инструмент cuda-memcheck (поставляется с CUDA), чтобы узнать, обнаруживает ли он недопустимый доступ к памяти и другие проблемы, связанные с памятью, с вашей программой (спасибо @RobertCrovella за напоминание).Запустив его, мы получим кучу ошибок из вашей программы, таких как:

========= Program hit cudaErrorInvalidValue (error 11) due to "invalid argument" on CUDA API call to cudaMemcpy. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x357283]
=========     Host Frame:a [0x3d70f]
=========     Host Frame:a [0x644c]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf1) [0x202e1]
=========     Host Frame:a [0x609a]

Итак, опять же, без тщательного изучения кода - вы, должно быть, предоставили неверные аргументы для cudaMemcpy().Проверьте вашу программу по документации Runtime API .

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