Mac中用clang++和nvcc编译cuda程序的一个例子

本文介绍了如何在Mac环境中利用clang++编译C++部分,结合nvcc编译CUDA内核代码,以实现CUDA程序的完整构建过程。主要涉及KernelWrapper.h头文件的定义,以及在main.cpp中调用cuda函数。
部署运行你感兴趣的模型镜像

主函数在main.cpp中,用clang++编译,cuda函数放在KernelWrapper.cu中,用nvcc编译。另外main.cpp中需要包含头文件KernelWrapper.h

KernelWrapper.h

#ifndef _KernelWrapper_h
#define _KernelWrapper_h

void RunTest();
#endif


KernelWrapper.cu

#include <stdio.h>
#include "KernelWrapper.h"

__global__ void TestDevice(int *deviceArray)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
deviceArray[idx] = deviceArray[idx]*deviceArray[idx];
}

void RunTest()
{
int* hostArray;
int* deviceArray;
const int arrayLength = 16;
const unsigned int memSize = sizeof(int) * arrayLength;

hostArray = (int*)malloc(memSize);
cudaMalloc((void**) &deviceArray, memSize);
printf("Init Data\n");

for(int i=0;i<arrayLength;i++)
{
hostArray[i] = i+1;
printf("%d\n", hostArray[i]);

}


cudaMemcpy(deviceArray, hostArray, memSize, cudaMemcpyHostToDevice);
TestDevice <<< 4, 4 >>> (deviceArray);
cudaMemcpy(hostArray, deviceArray, memSize, cudaMemcpyDeviceToHost);


printf("After Kernel Function\n");
for(int i=0;i<arrayLength;i++)
{

printf("%d\n", hostArray[i]);
}

cudaFree(deviceArray);
free(hostArray);

printf("done");
}


main.cpp
#include "KernelWrapper.h"

int main( int argc, char** argv)
{
    RunTest();
    
    return 0;
}

makefile

all: program

program: KernelWrapper.o main.o
    clang++ -o program -L/usr/local/cuda/lib -lcuda -lcudart KernelWrapper.o main.o

KernelWrapper.o:KernelWrapper.cu
    /usr/local/cuda/bin/nvcc -c -arch=sm_20 KernelWrapper.cu

main.o:main.cpp
    clang++ -c main.cpp

clean: 
    rm -f *.o program


您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### Clang++ 与 g++ 编译 C++ 项目的主要区别 #### 错误信息与诊断输出 Clang编译错误警告信息的可读性方面优于 g++,其输出通常更清晰、更具指导性。例如,Clang 会指出语法错误的具体位置,并提供建议性的修复提示,而 g++ 的错误信息较为冗长且不易理解[^1]。 #### 支持的标准与语言特性 g++ 对 C++ 标准的支持较为全面,尤其是对较新版本(如 C++20)的实现进度较快。相比之下,Clang 同样支持现代 C++ 标准,但在某些边缘特性的实现上可能略晚于 GCC。两者均支持 `-std=c++XX` 参数来启用特定标准版本,例如: ```bash g++ -std=c++17 main.cpp -o main clang++ -std=c++17 main.cpp -o main ``` #### 编译速度与性能优化 Clang编译速度通常快于 g++,尤其在增量编译时表现更为明显。这得益于其模块化设计 LLVM 架构的优势。而 g++ 在某些特定场景下可能生成更高效的机器码,尤其是在涉及复杂模板或 STL 容器的项目中。 #### 跨平台兼容性与工具链集成 Clang 是 LLVM 项目的一部分,具有良好的跨平台兼容性,适用于 macOS、Linux Windows 等多种系统。此外,Clang 可以无缝集成到 Xcode、Visual Studio 等开发环境中。g++ 则是 GNU 工具链的核心组件之一,在 Linux 平台上广泛使用,但在 Windows 上需要依赖 MinGW 或 Cygwin 来运行[^1]。 #### 静态分析与代码检查功能 Clang 提供了内置的静态分析工具 `clang-tidy` `clang-analyzer`,可用于检测潜在的代码缺陷、内存泄漏等问题。g++ 本身不包含此类工具,但可以通过外部插件(如 `-fanalyzer`)扩展其分析能力。 #### 对 OpenCV 等第三方库的支持 Clang g++ 均支持 OpenCV 库,但链接方式略有不同。通常情况下,Clang 推荐使用 `-I` 指定头文件路径,使用 `-L` 指定库路径,并通过 `-lopencv_core` 等参数链接具体模块。g++ 的用法类似,但需注意不同发行版下的库命名规则可能有所不同。 #### 示例:使用 Clang++ g++ 编译 OpenCV 程序 ```bash # 使用 clang++ clang++ -std=c++17 -I/usr/local/include/opencv4 -L/usr/local/lib main.cpp -lopencv_core -lopencv_highgui -o main ``` ```bash # 使用 g++ g++-13 -std=c++17 -I/usr/local/include/opencv4 -L/usr/local/lib main.cpp -lopencv_core -lopencv_highgui -o main ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值