"device-function-maxrregcount" 编译 cuda 代码时的消息
"device-function-maxrregcount" message while compiling cuda code
我正在尝试编写一个在内核中执行多向量点积的代码。我正在使用 cublasSdot 库中的 cublasSdot 函数来执行向量点积。这是我的代码:
using namespace std;
__global__ void ker(float * a, float * c,long long result_size,int n, int m)
{
float *sum;
int id = blockIdx.x*blockDim.x+threadIdx.x;
float *out1,*out2;
int k;
if(id<result_size)
{
cublasHandle_t handle;
cublasCreate(&handle);
out1 = a + id*m;
for(k=0;k<n;k++)
{
out2 =a + k*m;
cublasSdot(handle, m,out1,1,out2,1,sum);
c[id*n + k]= *sum;
}
}
}
int main()
{
int n=70000,m=100;
long result_size=n;
result_size*=n;
float * dev_data,*dev_result;
float * data = new float [n*m];
float * result = new float [result_size];
for (int i = 0; i< n; i++)
for(int j = 0; j <m;j++)
{
data[i*m+j]=rand();
}
cudaMalloc ((void**)&dev_data,sizeof(float)*m*n);
cudaMalloc ((void**)&dev_result,sizeof(float)*result_size);
cudaMemcpy( dev_data, data, sizeof(float) * m* n, cudaMemcpyHostToDevice);
int block_size=1024;
int grid_size=ceil((float)result_size/(float)block_size);
ker<<<grid_size,block_size>>>(dev_data,dev_result,result_size,n,m);
cudaDeviceSynchronize();
cudaMemcpy(result, dev_result, sizeof(float)*(result_size), cudaMemcpyDeviceToHost);
return 0;
}
我已经包含 cublas_v2 库并使用以下命令编译代码:
nvcc -lcublas_device -arch=sm_35 -rdc=true askstack.cu -o askstack
但我收到以下消息:
ptxas info : 'device-function-maxrregcount' is a BETA feature
任何人都可以让我知道我应该如何处理这条消息吗?
正如 talonmies 所说,此消息仅供参考。
NVCC 的这个 maxregcount 选项用于指定内核可以使用的寄存器的限制以及它使用的所有设备功能:
If a kernel is limited to a certain number of registers with the launch_bounds attribute or the --maxrregcount option, then all functions that the kernel calls must not use more than that number of registers; if they exceed the limit, then a link error will be given.
参见:NVCC Doc : 6.5.1. Object Compatibility
似乎 device-function-maxregcount 仅用于覆盖设备功能的此值。因此,您可以在内核和设备功能上允许不同的最大寄存器数量。
For device functions, this option overrides the value specified by --maxregcount.
我正在尝试编写一个在内核中执行多向量点积的代码。我正在使用 cublasSdot 库中的 cublasSdot 函数来执行向量点积。这是我的代码:
using namespace std;
__global__ void ker(float * a, float * c,long long result_size,int n, int m)
{
float *sum;
int id = blockIdx.x*blockDim.x+threadIdx.x;
float *out1,*out2;
int k;
if(id<result_size)
{
cublasHandle_t handle;
cublasCreate(&handle);
out1 = a + id*m;
for(k=0;k<n;k++)
{
out2 =a + k*m;
cublasSdot(handle, m,out1,1,out2,1,sum);
c[id*n + k]= *sum;
}
}
}
int main()
{
int n=70000,m=100;
long result_size=n;
result_size*=n;
float * dev_data,*dev_result;
float * data = new float [n*m];
float * result = new float [result_size];
for (int i = 0; i< n; i++)
for(int j = 0; j <m;j++)
{
data[i*m+j]=rand();
}
cudaMalloc ((void**)&dev_data,sizeof(float)*m*n);
cudaMalloc ((void**)&dev_result,sizeof(float)*result_size);
cudaMemcpy( dev_data, data, sizeof(float) * m* n, cudaMemcpyHostToDevice);
int block_size=1024;
int grid_size=ceil((float)result_size/(float)block_size);
ker<<<grid_size,block_size>>>(dev_data,dev_result,result_size,n,m);
cudaDeviceSynchronize();
cudaMemcpy(result, dev_result, sizeof(float)*(result_size), cudaMemcpyDeviceToHost);
return 0;
}
我已经包含 cublas_v2 库并使用以下命令编译代码:
nvcc -lcublas_device -arch=sm_35 -rdc=true askstack.cu -o askstack
但我收到以下消息:
ptxas info : 'device-function-maxrregcount' is a BETA feature
任何人都可以让我知道我应该如何处理这条消息吗?
正如 talonmies 所说,此消息仅供参考。
NVCC 的这个 maxregcount 选项用于指定内核可以使用的寄存器的限制以及它使用的所有设备功能:
If a kernel is limited to a certain number of registers with the launch_bounds attribute or the --maxrregcount option, then all functions that the kernel calls must not use more than that number of registers; if they exceed the limit, then a link error will be given.
参见:NVCC Doc : 6.5.1. Object Compatibility
似乎 device-function-maxregcount 仅用于覆盖设备功能的此值。因此,您可以在内核和设备功能上允许不同的最大寄存器数量。
For device functions, this option overrides the value specified by --maxregcount.