私はCUDAを初めて使用しています。私はCUDAを初めて使用しようとしています。私は、GPUに画像データをプッシュしようとしています、それを白黒にして、それを新しい画像に書き込みます。しかし、プログラムは私に黒と白のバージョンの代わりに黒のイメージを与えます。私は間違って何をしていますか?画像の幅と高さは3840x2160です。 CUDAでの画像処理に関するトラブル
__global__ void addMatrix(unsigned char *DataOut, unsigned char *DataIn)
{
int idx = threadIdx.x;
DataOut[idx] = (DataIn[idx] + DataIn[idx + 1] + DataIn[idx + 2])/3;
//
}
int main()
{
int iWidth, iHeight, iBpp, iHeightOut, iWidthOut;
vector<unsigned char> pDataIn;
vector<unsigned char> pDataOut;
int error1 = LoadBmpFile(L"3840x2160.bmp", iWidth, iHeight, iBpp, pDataIn);
if (error1 != 0 || pDataIn.size() == 0 || iBpp != 32)
{
std::cout << "erroror load input file!\n";
}
pDataOut.resize(pDataIn.size()/4);
unsigned int SizeIn, SizeOut;
unsigned char *devDatOut, *devDatIn, *PInData, *POutData;
int i = 0;
SizeIn = pDataIn.size();
SizeOut = pDataOut.size();
PInData = pDataIn.data();
POutData = pDataOut.data();
i = cudaMalloc((void**)&devDatIn, SizeIn * sizeof(unsigned char));
if(i != 0)
{
printf("cudaMalloc __e FAIL! Code: %d\n", i);
_getch();
}
i = cudaMalloc((void**)&devDatOut, SizeOut * sizeof(unsigned char));
if(i != cudaSuccess)
printf("cudaMalloc __e FAIL! Code: %d\n", i);
i = cudaMemcpy(devDatIn, PInData, SizeIn * sizeof(unsigned char), cudaMemcpyHostToDevice);
if(i != cudaSuccess)
printf(" cudaMemcpy __e FAIL! Code: %d\n", i);
i = cudaMemcpy(devDatOut, POutData, SizeOut * sizeof(unsigned char), cudaMemcpyHostToDevice);
if(i != cudaSuccess)
printf(" cudaMemcpy __e FAIL! Code: %d\n", i);
dim3 gridSize = dim3(1, 1, 1);
dim3 blockSize = dim3(SizeIn, 1, 1);
addMatrix<<<gridSize, blockSize>>>(devDatIn, devDatOut);
if (i == cudaGetLastError())
{
printf("Error! %d\n", cudaGetLastError());
_getch;
}
cudaEvent_t syncEvent;
cudaEventCreate(&syncEvent);
cudaEventRecord(syncEvent, 0);
cudaEventSynchronize(syncEvent);
cudaMemcpy(POutData, devDatOut, SizeOut * sizeof(unsigned char), cudaMemcpyDeviceToHost);
cudaEventDestroy(syncEvent);
i = WriteBmpFile(L"3840x2160_test2.bmp", iWidth, iHeight, 8, pDataOut.size(), pDataOut.data(), false);
if(i != 0)
printf(" cudaMemcpy __e FAIL! Code: %d\n", i);
cudaFree(devDatOut);
cudaFree(devDatIn);
}
EDIT 1:
おそらく 'SizeIn'は3840x2160 =約8のようなものです百万。 'SizeIn'が1024より大きい場合は、' dim3 blockSize = dim3(SizeIn、1、1); 'というCUDAブロックサイズを使用することはできません。さらに、カーネルを起動した直後の' cudaGetLastError() 'コールは、そのためにエラーを返すことがあります。あなたのカーネルも調整する必要があります。また、カーネルのデータへのインデックス付けも正しくありません。スレッドごとに3つずつストライドする必要があります。 –
だから私はdim3 blockSize = dim3(1024、1、1)、右を使用する必要がありますか?その後、cudaGetLastError()は何も返しませんが、プログラマはまだ私に黒いイメージを与えます。私はちょうどカーネルの部分に何が間違っているかは分かりません。 コードを変更して正常に動作させることはできますか? – Generwp