CUDA 的 CC++ 中的 STL、iostream、new、delete

作者:编程家 分类: c++ 时间:2025-07-13

CUDA C/C++ 中的 STL、iostream、new、delete

在 CUDA C/C++ 中,我们可以使用标准模板库(STL)、iostream、new 和 delete 来进行各种操作和管理。这些工具和功能使得在 CUDA 应用程序中进行数据处理和内存管理变得更加方便和高效。本文将介绍如何在 CUDA C/C++ 中使用这些功能,并提供相应的案例代码。

STL(Standard Template Library)

STL 是 C++ 中的一个强大的库,提供了一系列的容器(如 vector、list、map 等)和算法(如排序、查找等)来处理数据。在 CUDA C/C++ 中,我们可以使用 STL 来对数据进行处理和分析。

下面是一个使用 vector 容器的示例代码:

cpp

#include

#include

__global__ void vectorAdd(int* a, int* b, int* c, int size) {

int tid = threadIdx.x + blockIdx.x * blockDim.x;

if (tid < size) {

c[tid] = a[tid] + b[tid];

}

}

int main() {

int size = 1000;

std::vector a(size);

std::vector b(size);

std::vector c(size);

// 初始化向量 a 和 b

for (int i = 0; i < size; ++i) {

a[i] = i;

b[i] = i;

}

int* dev_a, * dev_b, * dev_c;

cudaMalloc(&dev_a, size * sizeof(int));

cudaMalloc(&dev_b, size * sizeof(int));

cudaMalloc(&dev_c, size * sizeof(int));

cudaMemcpy(dev_a, a.data(), size * sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy(dev_b, b.data(), size * sizeof(int), cudaMemcpyHostToDevice);

int blockSize = 256;

int gridSize = (size + blockSize - 1) / blockSize;

vectorAdd<<>>(dev_a, dev_b, dev_c, size);

cudaMemcpy(c.data(), dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);

cudaFree(dev_a);

cudaFree(dev_b);

cudaFree(dev_c);

// 输出结果

for (int i = 0; i < size; ++i) {

std::cout << c[i] << " ";

}

std::cout << std::endl;

return 0;

}

在上面的示例代码中,我们使用了 STL 的 vector 容器来存储输入和输出数据。首先,我们在主机端创建了两个 vector 容器 a 和 b,并使用 for 循环对其进行初始化。然后,我们使用 cudaMalloc 函数在设备端分配了内存,并使用 cudaMemcpy 函数将数据从主机端拷贝到设备端。接下来,我们定义了一个 CUDA 核函数 vectorAdd,用于将两个向量相加。最后,我们使用 cudaMemcpy 函数将结果从设备端拷贝回主机端,并在主机端打印输出结果。

iostream

iostream 是 C++ 中用于输入输出的标准库。在 CUDA C/C++ 中,我们可以使用 iostream 来方便地在主机端输出调试信息和结果。

下面是一个使用 iostream 的示例代码:

cpp

#include

#include

__global__ void helloWorld() {

int tid = threadIdx.x + blockIdx.x * blockDim.x;

printf("Hello World from thread %d!\n", tid);

}

int main() {

int blockSize = 256;

int gridSize = 1;

helloWorld<<>>();

cudaDeviceSynchronize();

std::cout << "CUDA Hello World!" << std::endl;

return 0;

}

在上面的示例代码中,我们定义了一个 CUDA 核函数 helloWorld,用于在每个线程中输出 "Hello World"。在主函数中,我们使用 iostream 的 std::cout 来输出 "CUDA Hello World!",以确认程序的执行。

new 和 delete

new 和 delete 是 C++ 中用于动态内存分配和释放的操作符。在 CUDA C/C++ 中,我们可以使用 new 和 delete 来动态分配和释放设备端的内存。

下面是一个使用 new 和 delete 的示例代码:

cpp

#include

#include

__global__ void vectorAdd(int* a, int* b, int* c, int size) {

int tid = threadIdx.x + blockIdx.x * blockDim.x;

if (tid < size) {

c[tid] = a[tid] + b[tid];

}

}

int main() {

int size = 1000;

int* a = new int[size];

int* b = new int[size];

int* c = new int[size];

// 初始化向量 a 和 b

for (int i = 0; i < size; ++i) {

a[i] = i;

b[i] = i;

}

int* dev_a, * dev_b, * dev_c;

cudaMalloc(&dev_a, size * sizeof(int));

cudaMalloc(&dev_b, size * sizeof(int));

cudaMalloc(&dev_c, size * sizeof(int));

cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);

int blockSize = 256;

int gridSize = (size + blockSize - 1) / blockSize;

vectorAdd<<>>(dev_a, dev_b, dev_c, size);

cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);

cudaFree(dev_a);

cudaFree(dev_b);

cudaFree(dev_c);

// 输出结果

for (int i = 0; i < size; ++i) {

std::cout << c[i] << " ";

}

std::cout << std::endl;

delete[] a;

delete[] b;

delete[] c;

return 0;

}

在上面的示例代码中,我们使用了 new 操作符在主机端动态分配了三个数组 a、b 和 c,用于存储输入和输出数据。然后,我们使用 cudaMalloc 函数在设备端分配了内存,并使用 cudaMemcpy 函数将数据从主机端拷贝到设备端。接下来,我们定义了一个 CUDA 核函数 vectorAdd,用于将两个向量相加。最后,我们使用 cudaMemcpy 函数将结果从设备端拷贝回主机端,并在主机端打印输出结果。最后,我们使用 delete 操作符释放了主机端的内存。

在 CUDA C/C++ 中,我们可以使用 STL、iostream、new 和 delete 来进行各种操作和管理。STL 提供了丰富的容器和算法,方便我们进行数据处理和分析。iostream 提供了方便的输入输出功能,用于输出调试信息和结果。new 和 delete 可以用于动态分配和释放设备端和主机端的内存。以上这些功能和工具使得在 CUDA 应用程序中进行数据处理和内存管理变得更加方便和高效。