Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cuBLAS cublasSgemv“;分段故障“;_C++_Cuda_Gpu_Cublas - Fatal编程技术网

C++ cuBLAS cublasSgemv“;分段故障“;

C++ cuBLAS cublasSgemv“;分段故障“;,c++,cuda,gpu,cublas,C++,Cuda,Gpu,Cublas,我在运行cublasSegmv时遇到了一个分段错误。我的GPU是K20Xm。这是我的代码 float *a, *x, *y; int NUM_VEC = 8; y = (float*)malloc(sizeof(float) * rows * NUM_VEC); a = (float*)malloc(sizeof(float) * rows * cols); x = (float*)malloc(sizeof(float) * cols * NUM_VEC); get_mat_random(a,

我在运行cublasSegmv时遇到了一个分段错误。我的GPU是K20Xm。这是我的代码

float *a, *x, *y;
int NUM_VEC = 8;
y = (float*)malloc(sizeof(float) * rows * NUM_VEC);
a = (float*)malloc(sizeof(float) * rows * cols);
x = (float*)malloc(sizeof(float) * cols * NUM_VEC);
get_mat_random(a, rows, cols);
get_vec_random(x, cols * NUM_VEC);

float *d_a = 0;
float *d_x = 0;
float *d_y = 0;

cudaMalloc((void **)&d_a, rows * cols * sizeof(float);
cudaMalloc((void **)&d_x, cols * NUM_VEC * sizeof(float);
cudaMalloc((void **)&d_y, rows * NUM_VEC * sizeof(float);
cublasSetVector(rows * cols, sizeof(float), a, 1, d_a, 1);
cublasSetVector(NUM_VEC * cols, sizeof(float), x, 1, d_x, 1);
cublasSetVector(NUM_VEC * rows, sizeof(float), y, 1, d_y, 1);
float alpha = 1.0f;
for (int i = 0; i < NUM_VEC; i++) {
  cublasSgemv(handle, CUBLAS_OP_T, cols, rows, &alpha, d_a, rows, d_x + i * cols, 1,0, d_y + i * rows, 1);
}
float*a、*x、*y;
int NUM_VEC=8;
y=(浮点*)malloc(sizeof(浮点)*行*NUM_VEC);
a=(浮点*)malloc(sizeof(浮点)*行*cols);
x=(浮点*)malloc(sizeof(浮点)*cols*NUM_VEC);
获取随机数据(a、行、列);
获取随机向量(x,cols*NUM\u vec);
浮点数*d_a=0;
浮点*d_x=0;
浮动*d_y=0;
Cudamaloc((无效**)和d_a,行*列*大小(浮动);
cudamaloc((void**)和d_x,cols*NUM_VEC*sizeof(float);
cudamaloc((void**)和d_y,行*NUM_VEC*sizeof(float);
cublasSetVector(行*列,大小(浮动),a,1,d_a,1);
立方体向量(NUM_VEC*cols,sizeof(float),x,1,d_x,1);
cublasSetVector(NUM_VEC*行,sizeof(float),y,1,d_y,1);
浮动α=1.0f;
对于(int i=0;i
在我的有限测试中,错误是因为
cublasSgemv
beta
参数不能为
NULL
。您应该在主机或设备上为
beta
变量分配内存。下面是我用来重现和修复错误的代码

#include <cstdio>
#include <iostream>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <cstdlib>

using namespace std;

void get_vec_random(float* a, int count)
{
    for(int i=0; i<count; i++)
        a[i] = rand() / float(RAND_MAX);    
}

void get_mat_random(float* a, int rows, int cols)
{
    get_vec_random(a, rows * cols);
}

int main(int argc, char** argv)
{
    int rows = 10, cols = 10;

    cublasHandle_t handle;
    cublasCreate(&handle);


    float *a, *x, *y;
    int NUM_VEC = 8;
    y = (float*)malloc(sizeof(float) * rows * NUM_VEC);
    a = (float*)malloc(sizeof(float) * rows * cols);
    x = (float*)malloc(sizeof(float) * cols * NUM_VEC);
    get_mat_random(a, rows, cols);
    get_vec_random(x, cols * NUM_VEC);

    float *d_a = 0;
    float *d_x = 0;
    float *d_y = 0;

    cudaMalloc((void **)&d_a, rows * cols * sizeof(float));
    cudaMalloc((void **)&d_x, cols * NUM_VEC * sizeof(float));
    cudaMalloc((void **)&d_y, rows * NUM_VEC * sizeof(float));


    cublasSetVector(rows * cols, sizeof(float), a, 1, d_a, 1);
    cublasSetVector(NUM_VEC * cols, sizeof(float), x, 1, d_x, 1);
    cublasSetVector(NUM_VEC * rows, sizeof(float), y, 1, d_y, 1);

    float alpha = 1.0f, beta = 1.0f;

    cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
    for (int i = 0; i < NUM_VEC; i++) 
    {
        cublasSgemv(handle, 
                    CUBLAS_OP_T, 
                    cols, 
                    rows, 
                    &alpha, 
                    d_a, 
                    rows, 
                    d_x + i * cols, 
                    1, 
                    &beta, 
                    d_y + i * rows, 
                    1);
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void get_vec_random(浮点*a,整数计数)
{

对于(int i=0),请提供您的工作以帮助抱歉。我把所有的代码都加了起来。@奎岩……如果解决了问题,你可以考虑接受答案,这样它就可以被标记为: