私はCUDAを初めて使用し、テストプログラムを作成しようとしています。GeForce GT 520 カードでアプリケーションを実行していますが、パフォーマンスが非常に低下します。
アプリケーションを使用して画像を処理し、各行を個別のスレッドで処理します。以下は、アプリケーションの簡略化されたバージョンです。実際のアプリケーションでは、すべての定数は実際には変数であることに注意してください。
以下のコードを実行すると、実行が完了するまでに20 秒以上かかります。
ただし、 malloc/freeを使用するのとは対照的に、 がローカル配列として定義されている場合(コメント行に表示されているように)、実行が完了するまでに1 秒もl_SrcIntegral
かかりません。
配列の実際のサイズは (1700 ではなく) 動的であるため、このローカル配列は実際のアプリケーションでは使用できません。
このかなり単純なコードのパフォーマンスを改善する方法についてアドバイスをいただければ幸いです。
#include "cuda_runtime.h"
#include <stdio.h>
#define d_MaxParallelRows 320
#define d_MinTreatedRow 5
#define d_MaxTreatedRow 915
#define d_RowsResolution 1
#define k_ThreadsPerBlock 64
__global__ void myKernel(int Xi_FirstTreatedRow)
{
int l_ThreadIndex = blockDim.x * blockIdx.x + threadIdx.x;
if (l_ThreadIndex >= d_MaxParallelRows)
return;
int l_Row = Xi_FirstTreatedRow + (l_ThreadIndex * d_RowsResolution);
if (l_Row <= d_MaxTreatedRow) {
//float l_SrcIntegral[1700];
float* l_SrcIntegral = (float*)malloc(1700 * sizeof(float));
for (int x=185; x<1407; x++) {
for (int i=0; i<1700; i++)
l_SrcIntegral[i] = i;
}
free(l_SrcIntegral);
}
}
int main()
{
cudaError_t cudaStatus;
cudaStatus = cudaSetDevice(0);
int l_ThreadsPerBlock = k_ThreadsPerBlock;
int l_BlocksPerGrid = (d_MaxParallelRows + l_ThreadsPerBlock - 1) / l_ThreadsPerBlock;
int l_FirstRow = d_MinTreatedRow;
while (l_FirstRow <= d_MaxTreatedRow) {
printf("CUDA: FirstRow=%d\n", l_FirstRow);
fflush(stdout);
myKernel<<<l_BlocksPerGrid, l_ThreadsPerBlock>>>(l_FirstRow);
cudaDeviceSynchronize();
l_FirstRow += (d_MaxParallelRows * d_RowsResolution);
}
printf("CUDA: Done\n");
return 0;
}