0

カーネル内で複数のベクトル内積を実行するコードを作成しようとしています。ベクトル内積を実行するために、 cublasライブラリの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

このメッセージに関して私がすべきことを誰か教えてください。

4

1 に答える 1

3

このメッセージは情報提供を目的としています。

この NVCC の maxregcount オプションは、カーネルとカーネルが使用するすべてのデバイス機能で使用できるレジスタの制限を指定するために使用されます。

カーネルが launch_bounds 属性または --maxrregcount オプションで特定の数のレジスターに制限されている場合、カーネルが呼び出すすべての関数はその数を超えるレジスターを使用してはなりません。制限を超えると、リンク エラーが発生します。

参照: NVCC Doc: 6.5.1。オブジェクトの互換性

device-function-maxregcount は、デバイス関数のみのこの値をオーバーライドするために使用されているようです。そのため、カーネルとデバイス関数で許可されるレジスタの最大数を変えることができます。

デバイス関数の場合、このオプションは --maxregcount で指定された値をオーバーライドします。

出典:CUDAハンドブック

于 2016-12-01T13:54:38.100 に答える