cuda矩陣編程

一、定義矩陣結(jié)構(gòu)體

    typedef struct
{
       int width;
        int height;
        float* elements;
}Matrix;

二、矩陣賦值

void magten(Matrix &t)
{
    for (int i = 0; i < t.width; i++)
    {
        for (int j = 0; j < t.height; j++)
        {
            t.elements[i*t.width + j] = rand() / BLOCK_SIZE + rand() / (BLOCK_SIZE*BLOCK_SIZE);
        }
    }
}

三、Device上執(zhí)行矩陣計(jì)算

__global__ static void Mulikernel(const Matrix a, const Matrix b, Matrix c)
{

    int row = blockDim.y*blockIdx.y + threadIdx.y;
    int col = blockDim.x*blockIdx.x + threadIdx.x;
    float sum = 0;
    for (int i = 0; i < a.width; i++)
    {
        sum += a.elements[row*a.width + i] * b.elements[i*a.width + col];
    }
    c.elements[c.width*row + col] = sum;
}

四、申明變量分配空間,數(shù)據(jù)傳輸

void Mul(Matrix &a, Matrix &b, Matrix &c)
{

    Matrix d_a, d_b, d_c;
    d_a.width = a.width;
    d_a.height = a.height;
    size_t size = a.width*a.height*sizeof(float);
    cudaMalloc(&d_a.elements, size);

    d_b.width = b.width;
    d_b.height = b.height;
    size = b.width*b.height * sizeof(float);
    cudaMalloc(&d_b.elements, size);

    d_c.width =c.width;
    d_c.height = c.height;
     size = c.width*c.height * sizeof(float);
    cudaMalloc(&d_c.elements, size);

    magten(a);
    magten(b);
    //magten(c);

    cudaMemcpy(d_a.elements, a.elements, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b.elements, b.elements, size, cudaMemcpyHostToDevice);
    //cudaMemcpy(&d_a, &a, size, cudaMemcpyHostToDevice);

    //Mulikernel << <BLOCK_SIZE, BLOCK_SIZE >> > (d_a, d_b, d_c);
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
    dim3 dimGrid(b.width / dimBlock.x, a.height / dimBlock.y);
    Mulikernel<< <dimGrid, dimBlock >> >(d_a, d_b, d_c);

    cudaMemcpy(c.elements, d_c.elements, size, cudaMemcpyDeviceToHost);

    //printf
    printf("success!");
    cudaFree(&d_a);
    cudaFree(&d_b);
    cudaFree(&d_c);
    //return 0;
}

五、主函數(shù)

int main()
{

    Matrix a, b, c;
    a.width = 6;
    a.height = 8;
    b.width = 8;
    b.height = 8;
    a.elements=(float*)malloc( a.height*a.width * sizeof(float));
    b.elements = (float*)malloc(b.height*b.width * sizeof(float));
    Mul(a, b, c);
    return 0;
}

總結(jié):程序分為這些部分,強(qiáng)調(diào)每一個(gè)程序必須有一個(gè)主函數(shù),因?yàn)槭浅绦蛉肟诘刂罚瑸樽兞糠峙浜每臻g,不要遺漏任何一個(gè)變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容