MATLAB’da CUBLAS ile Matris Çarpma İşlemi Nasıl Yapılır?
C=AXB işlemi yapılacaktır.
A:MxN boyutlu matris,
B:NxP boyutlu matris,
C:MXP boyutlu matristir.
cublasDemo.cpp isimli bir dosya oluşturarak içeriğini:
#include “mex.h”
Void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
}
şu şekilde dolduruyoruz. Bu c-mex için standart ibarelerdir.
Giriş verilerinin tipini önceden belirlememiz gerekmektedir. Kolaylık olması açısından single seçilmiştir, double olarak veriler belirlenirse kullanılacak komutlar değişecektir.
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 2)
mexErrMsgTxt("Invaid number of input arguments");
if (!mxIsSingle(prhs[0]) && !mxIsSingle(prhs[1]))
mexErrMsgTxt("input matrices must be single ");
float* A = (float*)mxGetData(prhs[0]);
float* B = (float*)mxGetData(prhs[1]);
int numARows = mxGetM(prhs[0]);
int numACols = mxGetN(prhs[0]);
int numBRows = mxGetM(prhs[1]);
int numBCols = mxGetN(prhs[1]);
If (numACols != numBRows)
mexErrMsgTxt("Invalid matrix dimension");
}
Çıkış matrisinin boyutları belirlenir:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 2)
mexErrMsgTxt("Invaid number of input arguments");
if (!mxIsSingle(prhs[0]) && !mxIsSingle(prhs[1]))
mexErrMsgTxt("input matrices must be single ");
float* A = (float*)mxGetData(prhs[0]);
float* B = (float*)mxGetData(prhs[1]);
int numARows = mxGetM(prhs[0]);
int numACols = mxGetN(prhs[0]);
int numBRows = mxGetM(prhs[1]);
int numBCols = mxGetN(prhs[1]);
int numCRows = numARows;
int numCCols = numBCols;
plhs[0] = mxCreateNumericMatrix(numCRows, numCCols, mxSINGLE_CLASS, mxREAL);
float* C = (float*)mxGetData(plhs[0]);
}
GPU’nun belleğinde matrisleri yerleştirmek için alan oluşturulmalıdır. Bunun için cudaMalloc ve cudaFree komutları kullanılır. Bu komutlar cuda_runtime.h dosyasında kayıtlı olduğundan ilk başta include edilmesi gerekmektedir.
#include "mex.h"
#include ,cuda_runtime.h.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 2)
mexErrMsgTxt("Invaid number of input arguments");
if (!mxIsSingle(prhs[0]) && !mxIsSingle(prhs[1]))
mexErrMsgTxt("input matrices must be single ");
float* A = (float*)mxGetData(prhs[0]);
float* B = (float*)mxGetData(prhs[1]);
int numARows = mxGetM(prhs[0]);
int numACols = mxGetN(prhs[0]);
int numBRows = mxGetM(prhs[1]);
int numBCols = mxGetN(prhs[1]);
int numCRows = numARows;
int numCCols = numBCols;
plhs[0] = mxCreateNumericMatrix(numCRows, numCCols, mxSINGLE_CLASS, mxREAL);
float* C = (float*)mxGetData(plhs[0]);
float *deviceA, *deviceB, *deviceC;
cudaMalloc(&deviceA, sizeof(float) * numARows * numACols);
cudaMalloc(&deviceB, sizeof(float) * numBRows * numBCols);
cudaMalloc(&deviceC, sizeof(float) * numCRows * numCCols);
// insert cuBLAS function(s) here
cudaFree(deviceA);
cudaFree(deviceB);
cudaFree(deviceC);
}
CUBLAS işlemleri için cublas_v2.h dosyasını include etmemiz gerekmektedir.
#include "mex.h"
#include ,cuda_runtime.h.
#include ,cublas_v2.h.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 2)
mexErrMsgTxt("Invaid number of input arguments");
if (!mxIsSingle(prhs[0]) && !mxIsSingle(prhs[1]))
mexErrMsgTxt("input matrices must be single ");
float* A = (float*)mxGetData(prhs[0]);
float* B = (float*)mxGetData(prhs[1]);
int numARows = mxGetM(prhs[0]);
int numACols = mxGetN(prhs[0]);
int numBRows = mxGetM(prhs[1]);
int numBCols = mxGetN(prhs[1]);
int numCRows = numARows;
int numCCols = numBCols;
plhs[0] = mxCreateNumericMatrix(numCRows, numCCols, mxSINGLE_CLASS, mxREAL);
float* C = (float*)mxGetData(plhs[0]);
float *deviceA, *deviceB, *deviceC;
cudaMalloc(&deviceA, sizeof(float) * numARows * numACols);
cudaMalloc(&deviceB, sizeof(float) * numBRows * numBCols);
cudaMalloc(&deviceC, sizeof(float) * numCRows * numCCols);
cublasHandle_t handle;
cublasCreate(&handle);
cublasSetMatrix(numARows,numACols,sizeof(float),A,numARows,deviceA,numARows);
cublasSetMatrix(numBRows,numBCols,sizeof(float),B,numBRows,deviceB,numBRows);
cublasDestroy(handle);
cudaFree(deviceA);
cudaFree(deviceB);
cudaFree(deviceC);
}
Başka bir CUBLAS fonksiyonu kullanılmadan cublasDestroy() ile yok etmemiz gerekmektedir.
Ayrıca cudaMemcpy() kullanmadan cublasSetMatrix ile veri GPU’nun belleğine çekilmektedir.
Matris çarpma işlemi için:
float alpha = 1.0f;
float beta = 0.0f;
cublasSgemm(handle,CUBLAS_OP_N,CUBLAS_OP_N,numARows,numBCols,numACols,&alpha,deviceA,numARows,deviceB,numBRows,&beta,deviceC,numCRows);
cublasGetMatrix(numCRows,numCCols,sizeof(float),deviceC,numCRows,C,numCRows);
CUBLAS kullanırken thread ve grid sayılarını belirlememize gerek yok, kendisi uygun olan değerleri duruma göre ayarlamaktadır.
Hazır olan c-mex kodumuzu derleyerek, çalışmaya hazır hale getirmeliyiz.
mex cublasDemo.cpp -lcudart -lcublas -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64"
-v -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include"
derlemeden sonra Windows 64 bit kullanıyorsak cublasDemo1.mexw64 dosyası oluşur.
Çalıştırmak için:
A = single(rand(200,300));
B = single(rand(300,400));
C = cublasDemo(A,B);
ASKON Konya’da MEVKA TeknoGirişim Girişimci-Yatırımcı Buluşmaları’na katıldım
ASKON Konya’nın MEVKA TeknoGirişim Girişimci-Yatırımcı Buluşmaları kapsamında 23 Ağustos 2023 Çarşamba günü ASKON Konya şubesinde>>>
Ağu
Matlab’da matrisin tüm elemanlarını belirli bir sayıdan nasıl çıkarırız?
Elimizde doğruluk oranlarının olduğu bir k matrisi olduğu varsayalım, bu matris içerisindeki tüm değerleri 1>>>
Şub
Matlab’ta iç içe döngüyle matris gezerek istediğimiz veriyi nasıl buluruz?
Başlık tam ifade eder mi bilmiyorum ama benim ihtiyacım olan şey 10 sütun, 1593 satıra>>>
Şub
A Review on Deep Learning-Based Methods Developed for Lung Cancer Diagnosis
Yüksek Lisans öğrencilerimden Türkan Beyza KARA’nın sunmuş olduğu “A Review on Deep Learning-Based Methods Developed>>>
Oca
İlk yabancı yazarlı ortak makalem yayınlandı
Birbirimizi hiç görmeden ve sesli olarak da hiç konuşmadan e-posta üzerinden tanışıp ortak bir çalışma>>>
4 Comments
Eki
Konya’da göz lazer ameliyatı oldum
25 yıldır takmakta olduğum ve kendisinden ayrılırken 6,5 numara olan gözlüğüme Konya’da göz lazer ameliyatımı>>>
Ağu
Tek kelimeyle beni nasıl tanımladılar?
YouTube üzerinden yapmış olduğum bir yoruma gelen yanıtta “…dürüst olun…” içeriğini görünce aklıma geçtiğimiz günlerde>>>
3 Comments
Ağu
Konya Akıllı Şehir HACKATHON’unda 3.olduk
Kısaca daha önceki yazımda bahsettiğim Konya Akıllı Şehir HACKATHON’unda 3.olduk. Selçuk Üniversitesi Teknoloji Fakültesi Bilgisayar>>>
1 Comment
May
Sentius ekibi olarak, Akıllı Şehir HACKATHON’una katıldık
Konya Akıllı Şehir HACKATHON’unda 3.olduk Konya Bilim Merkezi ile GDG Konya’nın düzenlediği Akıllı Şehir HACKATHON’una>>>
1 Comment
May
BİLMÖK 2022 için yazılmış gecikmiş bir yazı :)
Türkiye’nin en büyük öğrenci kongresi BİLMÖK 21-23 Mayıs 2022 günlerinde Konya’da Konya Teknik Üniversitesi’nin organizasyonuyla>>>
May
Genç Bakış Gazetesi’nden Beyzanur Polat’ın yaptığı haber…
Genç Bakış Gazetesi’nden Beyzanur Polat’ın yaptığı haber…>>>
Kas
Binary Sooty Tern Optimization Algorithms for solving Wind Turbine Placement Problem
Binary Sooty Tern Optimization Algorithms for solving Wind Turbine Placement Problem İndirmek için tıklayınız.>>>
Eyl
Konya Model Fabrika’yı Ziyaretim ve Konya Dijital Dönüşüm
“konya dijital dönüşüm” kelimesini Google üzerinden arattığım zaman Konya Model Fabrika‘yı keşfettim. 5 Ağustos 2021>>>
Ağu
Otomatlar, Biçimsel Diller ve Turing Makineleri – Dr. Emre Sermutlu – Cinius Yayınları
2020-2021 bahar yarıyılında Otomata Teorisi ve Biçimsel Diller dersini verirken kullanmam için Selçuk Üniversitesi Teknoloji>>>
Mar
4-6 MART 2021 ÇEVRİMİÇİ TÜBİTAK-2237-B PROJE EĞİTİMİ ETKİNLİĞİ KTÜ – TRABZON
Alanında dünyada öncü Prof. Dr. Yener EYÜBOĞLU, Prof. Dr. Asım KADIOĞLU, Prof. Dr. Nurettin YAYLI,>>>
Mar
ARDEB 1001 – 2020 Sonuçlarını Değerlendirme ve Yenilikler Toplantısı
>>>
Şub
2021 yılı içerisinde değerlendirilebilecek konferanslar
GLOBAL CONFERENCE on ENGINEERING RESEARCH online 2-5 June 2021 Abstract or Full Paper Submission: 2>>>
Şub
Sayfamda paylaştığım bütün Karikatürler silinmiştir
İsimsiz bir uyarı yorumuyla araştırdığım vakit gördüm ki bazı karikatüristler blog sayfalarında karikatür paylaşanlara dava>>>
Oca
MATLAB – Error: Functions cannot be indexed using {} or . indexing.
data = get(z9).OutputData{1}; satırında aşağıdaki şekilde hata vermekteydi. Error: Functions cannot be indexed using {}>>>
Oca
“ERASMUS+ Yüksek Öğretim” konulu seminer notları
“ERASMUS + Yüksek Öğretim” konulu seminer notları Dr. Öğretim Üyesi Kemal TÜTÜNCÜ hocam tarafından sunulan>>>
Oca