Rumah > pembangunan bahagian belakang > Golang > Laksanakan pengkomputeran heterogen yang cekap dalam bahasa Go

Laksanakan pengkomputeran heterogen yang cekap dalam bahasa Go

PHPz
Lepaskan: 2023-06-15 16:38:32
asal
1859 orang telah melayarinya

Dengan perkembangan teknologi maklumat yang berterusan, kerumitan dan keperluan kuantitatif pelbagai tugasan pengkomputeran semakin meningkat dari hari ke hari Cara menggunakan pelbagai sumber pengkomputeran untuk menyelesaikan tugasan ini dengan cekap telah menjadi salah satu masalah yang perlu diselesaikan. . Pengkomputeran heterogen adalah salah satu cara yang berkesan untuk menyelesaikan masalah ini Ia boleh menggunakan pelbagai jenis sumber pengkomputeran, seperti GPU, FPGA, dan lain-lain, untuk bekerjasama untuk mencapai pengkomputeran yang cekap. Artikel ini akan memperkenalkan cara melaksanakan pengkomputeran heterogen yang cekap dalam bahasa Go.

1. Konsep asas pengkomputeran heterogen

Pengkomputeran heterogen ialah sejenis pengkomputeran kolaboratif yang meningkatkan kecekapan pengkomputeran dengan menggabungkan pelbagai jenis sumber pengkomputeran, seperti CPU, GPU, FPGA, dsb. Cara. Dalam aplikasi praktikal, tugas pengkomputeran biasanya diuraikan kepada berbilang subtugas, kemudian ditugaskan kepada sumber pengkomputeran yang berbeza untuk pelaksanaan, dan kemudian hasilnya digabungkan untuk mendapatkan hasil akhir. Pengkomputeran heterogen boleh memanfaatkan ciri-ciri pelbagai jenis sumber pengkomputeran, seperti keselarian tinggi GPU dan fleksibiliti FPGA, untuk memilih sumber yang paling sesuai untuk tugas pengkomputeran yang berbeza untuk mencapai tujuan pengkomputeran yang cekap.

2. Sokongan pengkomputeran heterogen bagi bahasa Go

Bahasa Go ialah bahasa pengaturcaraan moden yang mempunyai ciri konkurensi, kecekapan dan kebolehpercayaan, dan sesuai untuk pengkomputeran heterogen. Bahasa Go menyediakan sokongan berbilang benang, yang boleh menggunakan prestasi berbilang teras CPU. Ia juga menyediakan sokongan untuk pelbagai sumber pengkomputeran heterogen, termasuk GPU, FPGA, dll. Menggunakan pengkomputeran heterogen dalam bahasa Go memerlukan bantuan beberapa perpustakaan pihak ketiga, seperti cuDNN, OpenCL, dsb.

3. Melaksanakan pengkomputeran heterogen dalam bahasa Go

Berikut ialah contoh mudah menggunakan GPU untuk melaksanakan operasi tensor dalam bahasa Go.

  1. Memperkenalkan perpustakaan pihak ketiga

Melaksanakan pengkomputeran heterogen dalam bahasa Go memerlukan penggunaan perpustakaan pihak ketiga, seperti cuDNN, OpenCL, dsb. Mengambil cuDNN sebagai contoh, anda perlu memasang perpustakaan cuDNN dan kit alat CUDA terlebih dahulu.

  1. Buat tensor

Untuk menggunakan GPU bagi melaksanakan operasi tensor dalam bahasa Go, anda perlu mencipta tensor terlebih dahulu. Anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk mencipta tensor:

xDesc, err := cudnn.CreateTensorDescriptor()
if err != nil {
    log.Fatal(err)
}

err = xDesc.Set(cudnn.TensorNCHW, cudnn.DataTypeFloat, 1, 3, 224, 224)
if err != nil {
    log.Fatal(err)
}

xDataSize, _, err := xDesc.GetSize()
if err != nil {
    log.Fatal(err)
}

x := make([]float32, xDataSize)
Salin selepas log masuk

Antaranya, xDesc mewakili deskriptor tensor dan anda boleh menentukan jenis, jenis data, bentuk, dsb. tensor x ialah data tensor, iaitu Array jenis float32.

  1. Buat konteks GPU

Untuk menggunakan GPU untuk pengiraan, anda perlu mencipta konteks GPU terlebih dahulu. Anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk mencipta konteks GPU:

ctx, err := cudnn.Create()
if err != nil {
    log.Fatal(err)
}
defer ctx.Destroy()
Salin selepas log masuk
  1. Salin data tensor ke GPU

Sebelum menggunakan GPU untuk pengiraan, anda perlu menyalin data tensor ke dalam GPU. Anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk menyalin data tensor ke GPU:

xDev, err := ctx.MallocMemory(xDataSize * 4)
if err != nil {
    log.Fatal(err)
}

err = xDev.HostTo(x)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk

Antaranya, xDev mewakili ruang storan pada GPU, dan fungsi MallocMemory digunakan untuk memperuntukkan fungsi HostTo digunakan untuk menyalin data pada hos ke pada GPU.

  1. Lakukan operasi tensor

Selepas menyalin data tensor ke GPU, anda boleh melakukan operasi tensor pada GPU. Anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk melaksanakan operasi tensor:

yDesc, err := cudnn.CreateTensorDescriptor()
if err != nil {
    log.Fatal(err)
}

err = yDesc.Set(cudnn.TensorNCHW, cudnn.DataTypeFloat, 1, 3, 224, 224)
if err != nil {
    log.Fatal(err)
}

alpha := float32(1)
beta := float32(0)

convDesc, err := cudnn.CreateConvolutionDescriptor(
    0, 0, 1, 1, 1, 1, cudnn.DataTypeFloat,
)
if err != nil {
    log.Fatal(err)
}

yDataSize, _, err := yDesc.GetSize()
if err != nil {
    log.Fatal(err)
}

y := make([]float32, yDataSize)
yDev, err := ctx.MallocMemory(yDataSize * 4)
if err != nil {
    log.Fatal(err)
}

err = cudnn.ConvolutionForward(
    ctx, alpha, xDesc, xDev.Ptr(), convDesc, nil, nil,
    cudnn.Convolution, cudnn.DataTypeFloat, beta, yDesc,
    yDev.Ptr(),
)
if err != nil {
    log.Fatal(err)
}

err = yDev.HostFrom(y)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk

Antaranya, yDesc mewakili deskriptor tensor keluaran dan beta mewakili berat berat dan convDesc mewakili deskriptor konvolusi; y ialah data tensor keluaran.

  1. Salin semula keputusan pengiraan kepada hos

Selepas pengiraan selesai, anda boleh menyalin semula keputusan pengiraan kepada hos. Anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk menyalin data yang disimpan pada GPU kembali ke hos:

err = yDev.HostFrom(y)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk
  1. Lepaskan sumber GPU

Selepas pengiraan selesai, anda perlu mengeluarkan sumber pada Sumber GPU, anda boleh menggunakan fungsi yang disediakan oleh cuDNN untuk mengeluarkan sumber GPU:

xDesc.Destroy()
yDesc.Destroy()
convDesc.Destroy()
xDev.Free()
yDev.Free()
ctx.Destroy()
Salin selepas log masuk

4. Ringkasan

Artikel ini memperkenalkan konsep dan kaedah asas untuk melaksanakan heterogen pengkomputeran dalam bahasa Go. Pengkomputeran heterogen boleh menggunakan pelbagai sumber pengkomputeran untuk pengkomputeran kolaboratif untuk meningkatkan kecekapan pengkomputeran. Melaksanakan pengkomputeran heterogen dalam bahasa Go memerlukan bantuan perpustakaan pihak ketiga, seperti cuDNN, OpenCL, dll. Dengan menggunakan fungsi perpustakaan ini, pengkomputeran heterogen boleh dilaksanakan dengan cekap dalam bahasa Go.

Atas ialah kandungan terperinci Laksanakan pengkomputeran heterogen yang cekap dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan