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);
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
Akademik bir makalenin Giriş kısmı nasıl yazılmalıdır?
Sinem Toraman @Sinem_Trmn tarafından verilen “Akademik Yazımda Metodolojik Sorunlar ve Çözüm Önerileri” başlıklı eğitimde bir>>>
Ara
4. Uluslararası Mühendislik Teknolojileri Konferansı
4. Uluslararası Mühendislik Teknolojileri Konferansı: https://icente.selcuk.edu.tr/>>>
Eyl
Kaç kere yeniden doğar insan?
Kaç kere yeniden doğar insan? Kaç kere yeniden doğmalı? Peki her doğumda aynı anadan mı>>>
Tem
Optimizasyon problemlerindeki belirsizlikler
Normalde bir x değişkeni için f(x) fonksiyonunun her zaman aynı sonucu üretmesi beklenir. Fakat bazı>>>
Tem
Moodle – mysql_full_unicode_support
Bu uyarıya rağmen Moodle kurulumu yapıldığı zaman bazı karakterlerin ve emojilerin desteklenmeyeceği belirtilmektedir.>>>
May
Moodle SSL ayarı nasıl yapılır?
SSL kurulumunuzu bitirdikten sonra config.php dosyasındaki: $CFG->wwwroot = 'http://sorucevaptest.com/moodle'; kısmındaki adresi https şeklinde düzenleyiniz. $CFG->wwwroot>>>
May
Moodle – mysql_full_unicode_support#File_format
Çözüm: https://docs.moodle.org/38/en/MySQL_full_unicode_support phpmyadmin yetkisi olanlar için: SET GLOBAL innodb_file_format = barracuda SET GLOBAL innodb_file_per_table =>>>
May
Tanım Teorileri: Platon’un İnsanı ders notları…
Tanım Teorileri: Platon’un İnsanı ders notları… İnsanın Tanımına Dair ders notları… başlıklı yazı: https://www.ahmetcevahircinar.com.tr/2020/04/19/insanin-tanimina-dair-ders-notlari/ “Namazın>>>
2 Comments
Nis
İnsanın Tanımına Dair ders notları…
İnsanın Tanımına Dair ders notları… İnsanın Tanımına Dair başlıklı videoyu yayınlandıktan 2 hafta sonra izleyebildim>>>
1 Comment
Nis
Uzman Sistemler -Bir Yapay Zeka Uygulaması- Novruz Allahverdi
Uzman Sistemler -Bir Yapay Zeka Uygulaması- Novruz Allahverdi Uzman Sistemler hakkında yabancı literatürün oldukça zengin>>>
Nis
Ne yapmayı düşünüyorsun?
“Ne yapmayı düşünüyorsun? Bu soru karşısında Martin Heidegger biraz duraklar ve şöyle der: “Hem düşünmek>>>
Ara
Eğlenerek İngilizce öğrenmek için Duolingo
Duolingo 2011 yılında ortaya çıkmış, benim 2016 yılında üye olduğum fakat geçtiğimiz günlerde Twitter’da yeniden>>>
Ara
Online MS Paint – jspaint.app
Windows işletim sistemine sahip olmadığınız ortamlarda alışkın olduğunuz Paint programını online olarak kullanabilirsiniz. Online Paint>>>
Ara
VATAN HAİNİ – Nâzım Hikmet
“Nâzım Hikmet vatan hainliğine devam ediyor hâlâ. Amerikan emperyalizminin yarı sömürgesiyiz, dedi Hikmet. Nâzım Hikmet>>>
Kas
Gün Doğumu, Konya, 29 Kasım 2019
Gün Doğumu aynen Gün Batımı gibi en çok fotoğraflanan fenomenlerden biridir herhalde. 29 Kasım 2019>>>
Kas