В настоящее время я экспериментирую с производительностью кода OpenCL с использованием графического процессора и с использованием C++ на процессоре. Я написал программы, которые вычисляют сумму z = x + y, где z, x и y - двумерные массивы (матрицы) для GPU и CPU. После тестирования этих программ я обнаружил, что процессор намного эффективнее вычисляет эту сумму, чем графический процессор из-за медленной передачи данных в шине PCI между GPU и CPU. Теперь я хочу определить, сколько еще потребуется больших сумм, чтобы сделать использование GPU более эффективным, чем процессор. Я планирую сделать это, увеличив сумму z = x + y до z = x + y + y + y + y + ... и так далее.Производительность добавления 2D-массивов на GPU и CPU
Можно ли сделать использование GPU более эффективным, чем процессор, просто увеличив количество сумм для этой конкретной проблемы?
Как и FYI: Я использую графическую карту nVIDIA GeForce GT 640 и i5 процессор Intel Core.
Любая помощь будет принята с благодарностью.
EDIT:
Ниже я прилагаю мой код на CPU:
int main(int argc, const char * argv[])
{
//This value determines the size of the nxn (square array)
int n = 1000;
//Allocating the memory for the nxn arrays of floats.
float **x = (float**)malloc(sizeof(float*)*n);
float **y = (float**)malloc(sizeof(float*)*n);
float **z = (float**)malloc(sizeof(float*)*n);
//Initializing the arrays.
for(int i = 0; i<n; i++){
x[i] = (float*)malloc(sizeof(float)*n);
y[i] = (float*)malloc(sizeof(float)*n);
z[i] = (float*)malloc(sizeof(float)*n);
for(int j = 0; j<n; j++){
x[i][j] = i+j;
y[i][j] = i+j;
}
}
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
z[i][j] = x[i][j] + y[i][j];
for(int k = 0; k < 100; k++){
z[i][j] += y[i][j];
}
}
}
return 0;
}
А вот C++ с использованием OpenCL: (используется для копирования данных и выполнить ядро на GPU)
int n = 1000;
for(int i = 0; i<n; i++)
{
//Writing the data from the host to the device
err = clEnqueueWriteBuffer(queue, d_xx, CL_TRUE, 0, sizeof(float)*n, h_xx[i], 0, NULL, NULL);
if(err != CL_SUCCESS){
std::cout << "Error: Could not write to buffer d_xx" << std::endl;
exit(1);
}
err = clEnqueueWriteBuffer(queue, d_yy, CL_TRUE, 0, sizeof(float)*n, h_yy[i], 0, NULL, NULL);
if(err != CL_SUCCESS){
std::cout << "Error: Could not write to buffer d_yy" << std::endl;
exit(1);
}
//Setting the Kernel Arguments
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_xx);
if(err != CL_SUCCESS){
std::cout << "Error: Could not set kernel argument h_xx." << std::endl;
exit(1);
}
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &d_yy);
if(err != CL_SUCCESS){
std::cout << "Error: Could not set kernel argument h_yy." << std::endl;
exit(1);
}
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &d_zz);
if(err != CL_SUCCESS){
std::cout << "Error: Could not set kernel argument h_zz." << std::endl;
}
work_units_per_kernel = n;
//Executing the Kernel
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &work_units_per_kernel, NULL, 0, NULL, NULL);
if(err != CL_SUCCESS){
std::cout << "Error: Could not execute kernel." << std::endl;
exit(1);
}
//Reading the Data from the Kernel
err = clEnqueueReadBuffer(queue, d_zz, CL_TRUE, 0, n*(sizeof(float)), h_zz[i], 0, NULL, NULL);
if(err != CL_SUCCESS){
std::cout << "Error: Could not read data from kernel." << std::endl;
exit(1);
}
}
И, наконец, код ядра выполняется на GPU:
__kernel void arraysum(__global const float *d_aa, __global const float *d_bb, __global float *d_cc)
{
int i = get_global_id(0);
d_cc[i] = d_aa[i] + d_bb[i];
for(int j = 0; j < 100; j++){
d_cc[i] += d_bb[i];
}
}
Почему бы вам не написать свой код здесь? GPU выигрывает, если вы parallalize. Также у GPU может быть более высокая память. Вы распараллеливаете свою программу? Потому что поток ONE cpu будет работать лучше, чем ONE GPU «thread». – SigTerm
@SigTerm Спасибо за ваш ответ. Я добавил некоторые фрагменты кода. Надеюсь, они помогут прояснить ситуацию относительно того, распараллелен ли я в своей программе или нет. – user2736519
Похоже на классический случай, когда вы делаете так мало вычислений, что операция в целом связана с памятью, поэтому, если вы не сможете больше сделать с данными на графическом процессоре, скорость шины будет терять больше, чем сама прибыль GPU. –