我可以从非nvcc编译的C++代码中调用CUDA运行时函数吗?

问题描述 投票:0回答:3

有什么方法可以调用 CUDA 运行时函数调用,例如

cudaMemcpy(...);

在 .cpp 文件中,使用常规 C++ 编译器编译?

c++ cuda compatibility
3个回答
19
投票

编辑:这里有一个示例,但不再找到,但大部分示例都复制在下面。

调用者 C(但也可以是 C++)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cuda.h>

extern void kernel_wrapper(int *a, int *b);

int main(int argc, char *argv[])
{
   int a = 2;
   int b = 3;

   kernel_wrapper(&a, &b);

   return 0;
}

被调用者(CUDA)

__global__ void kernel(int *a, int *b)
{
   int tx = threadIdx.x;

   switch( tx )
   {
case 0:
    *a = *a + 10;
    break;
case 1:
    *b = *b + 3;
    break;
default:
    break;
   }
}

void kernel_wrapper(int *a, int *b)
{
   int *d_1, *d_2;
   dim3 threads( 2, 1 );
   dim3 blocks( 1, 1 );

   cudaMalloc( (void **)&d_1, sizeof(int) );
   cudaMalloc( (void **)&d_2, sizeof(int) );

   cudaMemcpy( d_1, a, sizeof(int), cudaMemcpyHostToDevice );
   cudaMemcpy( d_2, b, sizeof(int), cudaMemcpyHostToDevice );

   kernel<<< blocks, threads >>>( a, b );

   cudaMemcpy( a, d_1, sizeof(int), cudaMemcpyDeviceToHost );
   cudaMemcpy( b, d_2, sizeof(int), cudaMemcpyDeviceToHost );

   cudaFree(d_1);
   cudaFree(d_2);
}

1
投票

与@PreetSangha(提供了一个非常有用的答案)类似,我在运行它时遇到了一些问题

extern ...
所以我只想添加对我有用的解决方案(包括模板化函数调用)。

这是我的示例的代码(完整的 CUDA 代码被排除,因为它已经在 @PreetSangha 的示例中),并且应该给出其工作原理的主要想法。它被编译并确认可以在Linux机器上运行。我还没有在 Windows 上尝试过,但应该类似。在我的场景中,我想尝试

int
float
double
,但可以添加更多模板。

// main.cpp
#include "wrapper.hpp"

int main(int argc, char *argv[]) {
    runOnGPU(1,2,3);
}
// cuda.cu
#include "wrapper.hpp"

template<typename T>
__global__ static void matMultCUDA(const T* a, const T* b, T* c, int n) {
    int col = threadIdx.x + blockIdx.x * blockDim.x;
    int row = threadIdx.y + blockIdx.y * blockDim.y;
    
    T value = 0;
    if(col < n && row < n)
        for(int j=0; j < n; j++){
            value += a[row*n + j] * b[j*n+col];
        }
        
    c[row*n + col] = value;
}

bool InitCUDA(bool b) {
    /* CUDA Initialization */
}

template<typename T>
float runOnGPU(T *a, T *b, int n) {
    /* Do CUDA things here :D */
    matMultCUDA<<<dimGrid, dimBlock>>>(cuda_a , cuda_b , cuda_c , n);
}


template float runOnGPU<int>(int* a, int* b, int n);
template float runOnGPU<float>(float* a, float* b, int n);
template float runOnGPU<double>(double* a, double* b, int n);
// wrapper.hpp

bool InitCUDA(bool b);

template<typename T>
float runOnGPU(T *a, T *b, int n);
# makefile
CXX = g++
CXXFLAGS = -O3
NVCC = nvcc
NVCCFLAGS = -O3

LDFLAGS = -lcudart

OBJS = main.o cuda.o

all: program

program: $(OBJS)
        $(CXX) $(CXXFLAGS) -L/usr/local/cuda-11/lib64 cuda.o main.o -o program.out $(LDFLAGS)

main.o: main.cpp wrapper.hpp
        $(CXX) $(CXXFLAGS) -c main.cpp

cuda.o: cuda.cu wrapper.hpp
        $(NVCC) $(NVCCFLAGS) -c cuda.cu

0
投票

你可以使用

g++ I/usr/local/cuda/include filename.cpp -o obj -L/usr/local/cuda/lib64 -lcudart

用于编译或

nvcc filename.cu
© www.soinside.com 2019 - 2024. All rights reserved.