有什么方法可以调用 CUDA 运行时函数调用,例如
cudaMemcpy(...);
在 .cpp 文件中,使用常规 C++ 编译器编译?
编辑:这里有一个示例,但不再找到,但大部分示例都复制在下面。
调用者 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);
}
与@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
你可以使用
g++ I/usr/local/cuda/include filename.cpp -o obj -L/usr/local/cuda/lib64 -lcudart
用于编译或
nvcc filename.cu