Как включить отдельную компиляцию для проекта CUDA в Visual Studio

Я новичок в CUDA. Я пытаюсь написать приложение, в котором я вызываю одну функцию ядра из другой функции ядра. Но я получаю сообщение об ошибке "запуск ядра с устройства или глобальные функции требуют отдельного режима компиляции" при сборке приложения. Вот мой полный код. Любая помощь будет оценена по достоинству.

#include<iostream>
#include<curand.h>
#include<cuda.h>
#include <curand_kernel.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

__device__ int *vectorData;
__device__ void initializeArray(int elementCount)
{
    for (int i = 0; i < elementCount; i++)
    {
        vectorData[i] = 1;
    }
}
__global__ void AddOneToEachElement(int elementCount)
{
    for (int i = 0; i < elementCount; i++)
    {
        vectorData[i] = vectorData[i]+1;
    }
}
__global__ void addKernel(int *numberOfElements)
{
    vectorData = (int*)malloc(sizeof(int));
    initializeArray(*numberOfElements);
    int gridSize = ceil((*numberOfElements) / 1024) + 1;
    AddOneToEachElement << <gridSize, 1024 >> > (*numberOfElements);
    cudaDeviceSynchronize();
    free(vectorData);
}

int main()
{
    int numberOfElements = 1;
    int *device_numberOfElements;
    cudaMalloc((int**)&device_numberOfElements, sizeof(int));
    cout << "Enter the Number of elements" << endl;
    cin >> numberOfElements;
    cudaMemcpy(device_numberOfElements, &(numberOfElements), sizeof(int), cudaMemcpyHostToDevice);
    addKernel << <1, 1 >> > (device_numberOfElements);
    cudaFree(device_numberOfElements);
    return 0;
}


person Muhammad Gulfam    schedule 17.12.2019    source источник
comment
Проблема решена с помощью информации, доступной по следующей ссылке: orangeowlsolutions.com/archives/1965.   -  person Muhammad Gulfam    schedule 18.12.2019


Ответы (1)


Проблема решена с помощью информации, доступной по следующей ссылке: Использование динамического параллелизма CUDA в Visual Studio

Вот полная информация, которую я получил по вышеупомянутой ссылке:

Начиная с CUDA 5.0, CUDA позволяет использовать динамический параллелизм для графических процессоров с вычислительной мощностью 3.5 или выше. Динамический параллелизм позволяет запускать ядра непосредственно из других ядер и обеспечивает дальнейшее ускорение в тех приложениях, которые могут выиграть от лучшей обработки вычислительных рабочих нагрузок во время выполнения непосредственно на графическом процессоре; во многих случаях динамический параллелизм позволяет избежать взаимодействия CPU/GPU с преимуществами таких механизмов, как рекурсия. Чтобы использовать динамический параллелизм в Visual Studio 2010 или Visual Studio 2013, выполните следующие действия.

  • Вид -> Страницы свойств
  • Свойства конфигурации -> CUDA C/C++ -> Общие -> Создать код перемещаемого устройства -> Да (-rdc=true)
  • Свойства конфигурации -> CUDA C/C++ -> Устройство -> Генерация кода -> Compute_35, sm_35
  • Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости -> cudadevrt.lib
person Muhammad Gulfam    schedule 17.12.2019
comment
Совершенно нормально ответить на свой вопрос и добавить источник ответа в виде ссылки. Но ответ должен содержать всю необходимую информацию, чтобы ответить на вопрос без необходимости переходить по ссылке. Причина этого в том, что эта внешняя ссылка может стать недоступной в любое время, и это сделает этот ответ бесполезным. - person t.niese; 18.12.2019
comment
Спасибо. Я ценю ваше предложение. - person Muhammad Gulfam; 18.12.2019