之前代码出现执行出现问题,执行不了设备上的代码,后面将cuda9.2 --> cuda9.0就解决这个问题,看来cuda版本与驱动版本这些迭代版本问题还是很有迷惑性的。
本章代码源于一个学习材料,材料地址也忘了。写本文目的是为了将代码中的一些重要信息给描述出来,供后续参考:
#include <stdio.h>
__global__ void add(int *a, int *b, int *c)
{
*c = *a + *b;
}
int main(void)
{
int a, b, c;
// host copies of a, b, c
int *d_a, *d_b, *d_c;
// device copies of a, b, c
int size = sizeof(int);
// Allocate space for device copies of a, b, c
// 下面这三个语句的形式非常重要,这表明cuda程序分配的内存问题,内存分配在device上,但是它
// 在设备上的地址则在host上的内存里面,所以才有了这个”指向指针变量的指针变量“
cudaMalloc((void **)&d_a, size);
cudaMalloc((void **)&d_b, size);
cudaMalloc((void **)&d_c, size);
// Setup input values a = 2; b = 7;
// Copy inputs to device
cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
// Launch add() kernel on GPU
add<<<1,1>>>(d_a, d_b, d_c);
printf(" c = %d \n" , c);
// Copy result back to host
cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);
// Cleanup
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
return 0;
}
并且获取设备信息的代码也很重要,因为之前使用cuda9.2时候,这个代码就可以无报错的执行,但是却不能执行在device上的代码。所以这时候,获取设备就可以来验证cuda版本适配是否有问题了。
获取设备信息代码如下:
#include<iostream>
int main()
{
cudaDeviceProp prop;
int count;
cudaGetDeviceCount(&count);//获取设备数目,比如GTX295 有两个GPU(也就是双核) count为2
for(int i=0;i<count;i++)
{
cudaGetDeviceProperties(&prop,i);//将第i个GPU数据放到prop中
std::cout<<"显卡名称:"<<prop.name<<std::endl;
std::cout<<"显存大小:"<<prop.totalGlobalMem/1024/1024<<" MB"<<std::endl;
std::cout<<"一个block的共享内存大小:"<<prop.sharedMemPerBlock/1024<<" KB"<<std::endl;
std::cout<<"block最大线程数:"<<prop.maxThreadsPerBlock<<std::endl;
}
return 0;
}
Done!