nvcc gcc g++混合编译器编程

举报
风吹稻花香 发表于 2021/06/05 00:33:19 2021/06/05
【摘要】 nvcc gcc g++混合编译器编程 有很多同鞋问怎么使用CUDA和其它的编译器连用呢?混合编程? 先吧代码贴出来: 文件1 : test1.cu [cpp]  view plain  copy //文件:test1.cu  #include <stdio.h>&nbsp...
nvcc gcc g++混合编译器编程

有很多同鞋问怎么使用CUDA和其它的编译器连用呢?混合编程?

先吧代码贴出来:

文件1 : test1.cu

[cpp]  view plain  copy
  1. //文件:test1.cu  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <cuda_runtime.h>  
  5.   
  6. #define ROWS 32  
  7. #define COLS 16  
  8. #define CHECK(res) if(res!=cudaSuccess){exit(-1);}  
  9. __global__ void Kerneltest(int **da, unsigned int rows, unsigned int cols)  
  10. {  
  11.   unsigned int row = blockDim.y*blockIdx.y + threadIdx.y;  
  12.   unsigned int col = blockDim.x*blockIdx.x + threadIdx.x;  
  13.   if (row < rows && col < cols)  
  14.   {  
  15.     da[row][col] = row*cols + col;  
  16.   }  
  17. }  
  18.   
  19. extern "C" int func() // 注意这里定义形式  
  20. {  
  21.   int **da = NULL;  
  22.   int **ha = NULL;  
  23.   int *dc = NULL;  
  24.   int *hc = NULL;  
  25.   cudaError_t res;  
  26.   int r, c;  
  27.   bool is_right=true;  
  28.   
  29.   res = cudaMalloc((void**)(&da), ROWS*sizeof(int*));CHECK(res)  
  30.   res = cudaMalloc((void**)(&dc), ROWS*COLS*sizeof(int));CHECK(res)  
  31.   ha = (int**)malloc(ROWS*sizeof(int*));  
  32.   hc = (int*)malloc(ROWS*COLS*sizeof(int));  
  33.   
  34.   for (r = 0; r < ROWS; r++)  
  35.   {  
  36.     ha[r] = dc + r*COLS;  
  37.   }  
  38.   res = cudaMemcpy((void*)(da), (void*)(ha), ROWS*sizeof(int*), cudaMemcpyHostToDevice);CHECK(res)  
  39.   dim3 dimBlock(16,16);  
  40.   dim3 dimGrid((COLS+dimBlock.x-1)/(dimBlock.x), (ROWS+dimBlock.y-1)/(dimBlock.y));  
  41.   Kerneltest<<<dimGrid, dimBlock>>>(da, ROWS, COLS);  
  42.   res = cudaMemcpy((void*)(hc), (void*)(dc), ROWS*COLS*sizeof(int), cudaMemcpyDeviceToHost);CHECK(res)  
  43.   
  44.   for (r = 0; r < ROWS; r++)  
  45.   {  
  46.     for (c = 0; c < COLS; c++)  
  47.     {     
  48.       printf("%4d ", hc[r*COLS+c]);  
  49.       if (hc[r*COLS+c] != (r*COLS+c))  
  50.       {     
  51.         is_right = false;  
  52.       }     
  53.     }     
  54.     printf("\n");  
  55.   }  
  56.   printf("the result is %s!\n", is_right? "right":"false");  
  57.   
  58.   cudaFree((void*)da);  
  59.   cudaFree((void*)dc);  
  60.   free(ha);  
  61.   free(hc);  
  62. //  getchar();  
  63.   return 0;  
  64. }  

文件2:test2.c

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int func(); // 注意声明  
  4. int main()  
  5. {  
  6.     func();  
  7.     return 0;  
  8. }  

文件3 :test3.cpp 

[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. extern "C" int func(); //注意这里的声明  
  5. int main()  
  6. {  
  7.     func();  
  8.     return 0;  
  9. }  



几个方案可以用:

方案1:

    将所有文件分别编译,最后统一合并!

    对于C程序

[cpp]  view plain  copy
  1. []$nvcc -c test1.cu  
  2. []$gcc  -c test2.c  
  3. []$gcc  -o testc test1.o test2.o -lcudart -L/usr/local/cuda/lib64  


    C++ 程序

[cpp]  view plain  copy
  1. []$nvcc -c test1.cu  
  2. []$g++  -c test3.cpp  
  3. []$g++  -o testcpp test1.o test3.o -lcudart -L/usr/local/cuda/lib64  

方案2:

    将CUDA程序弄成静态库

    对于C程序

[cpp]  view plain  copy
  1. []$nvcc -lib test1.cu -o libtestcu.a  
  2. []$gcc       test2.c -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testc  

    特别注意:test2.c在链接库的前面

    对于C++

完全域C类似,只要将gcc 换成g++, test2.c换成test3.cpp


方案3:

   将CUDA程序弄成动态库

    makefile

[cpp]  view plain  copy
  1. all : c cpp   
  2.   
  3. c : libtestcu.so  
  4.   gcc test2.c   -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testc  
  5.   
  6. cpp : libtestcu.so  
  7.   g++ test3.cpp -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testcpp  
  8.   
  9. libtestcu.so : test.cu  
  10.   nvcc -o libtestcu.so -shared -Xcompiler -fPIC test1.cu  
  11.   
  12.   
  13. clean :  
  14.   rm *.so testc testcpp  -f  


应该能看懂。

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/80402205

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。