OpenCL新手问题
我正在尝试编写内核以在图像的矩形区域上执行某些任务。
的OpenCL
__kernel void GrayBlockSignalSeparation
(
__global float * rhos
)
{
const int neighbourhoodSize = 60;
const int x = get_global_id(0);
const int y = get_global_id(1);
rhos[x - 1 + (y-1)*(neighbourhoodSize) ] = x;
}
C#
private static void GraySignalSeparation
(
ref Image<Gray, float> Signal
)
{
float[] rhos = new float[(int)(image.Width / 60) * (int)(image.Height / 60)];
CLCalc.Program.Variable rhosVar = new CLCalc.Program.Variable(rhos);
CLCalc.Program.MemoryObject[] args = new CLCalc.Program.MemoryObject[]
{
rhosVar
};
GraySignalSeparationKernel.Execute(args, new int[] { (int)(image.Width / 60), (int)(image.Height / 60) });
rhosVar.ReadFromDeviceTo(rhos);
}
当我检查调试器中的rho值时,我发现其中一些似乎已被遗漏并被设置为零。
[0] 1
[1] 2
[2] 3
[3] 4
[4] 5
[5] 6
[6] 7
[7] 8
[8] 9
[9] 10
[10] 11
[11] 12
[12] 13
[13] 14
[14] 15
[15] 16
[16] 17
[17] 18
[18] 19
[19] 20
[20] 21
[21] 22
[22] 23
[23] 24
[24] 25
[25] 26
[26] 27
[27] 28
[28] 29
[29] 30
[30] 31
[31] 0
[32] 0
[33] 0
[34] 0
[35] 0
[36] 0
[37] 0
[38] 0
[39] 0
[40] 0
[41] 0
[42] 0
[43] 0
[44] 0
[45] 0
[46] 0
[47] 0
[48] 0
[49] 0
[50] 0
[51] 0
[52] 0
[53] 0
[54] 0
[55] 0
[56] 0
[57] 0
[58] 0
[59] 0
[60] 1
[61] 2
[62] 3
[63] 4
[64] 5
[65] 6
[66] 7
[67] 8
[68] 9
[69] 10
[70] 11
[71] 12
[72] 13
[73] 14
[74] 15
[75] 16
[76] 17
[77] 18
[78] 19
[79] 20
[80] 21
[81] 22
[82] 23
[83] 24
[84] 25
[85] 26
[86] 27
[87] 28
[88] 29
[89] 30
[90] 31
[91] 0
[92] 0
[93] 0
[94] 0
[95] 0
[96] 0
[97] 0
[98] 0
[99] 0
[100] 0
[101] 0
[102] 0
[103] 0
[104] 0
[105] 0
[106] 0
[107] 0
[108] 0
[109] 0
[110] 0
[111] 0
[112] 0
[113] 0
[114] 0
[115] 0
[116] 0
[117] 0
[118] 0
[119] 0
[120] 1
[121] 2
[122] 3
[123] 4
[124] 5
[125] 6
[126] 7
[127] 8
[128] 9
[129] 10
[130] 11
[131] 12
[132] 13
[133] 14
[134] 15
[135] 16
[136] 17
[137] 18
[138] 19
[139] 20
[140] 21
[141] 22
[142] 23
[143] 24
[144] 25
[145] 26
[146] 27
[147] 28
[148] 29
[149] 30
[150] 31
[151] 0
[152] 0
[153] 0
[154] 0
[155] 0
[156] 0
[157] 0
[158] 0
[159] 0
[160] 0
[161] 0
[162] 0
[163] 0
[164] 0
[165] 0
[166] 0
[167] 0
[168] 0
[169] 0
[170] 0
[171] 0
[172] 0
[173] 0
[174] 0
[175] 0
[176] 0
[177] 0
[178] 0
[179] 0
[180] 1
[181] 2
[182] 3
[183] 4
[184] 5
[185] 6
[186] 7
[187] 8
[188] 9
[189] 10
[190] 11
[191] 12
[192] 13
[193] 14
[194] 15
[195] 16
[196] 17
[197] 18
[198] 19
[199] 20
[200] 21
[201] 22
[202] 23
[203] 24
[204] 25
[205] 26
[206] 27
[207] 28
[208] 29
[209] 30
[210] 31
[211] 0
[212] 0
[213] 0
[214] 0
[215] 0
[216] 0
[217] 0
[218] 0
[219] 0
[220] 0
[221] 0
[222] 0
[223] 0
[224] 0
[225] 0
[226] 0
[227] 0
[228] 0
[229] 0
[230] 0
[231] 0
[232] 0
[233] 0
[234] 0
[235] 0
[236] 0
[237] 0
[238] 0
[239] 0
[240] 1
[241] 2
[242] 3
[243] 4
[244] 5
[245] 6
[246] 7
[247] 8
[248] 9
[249] 10
[250] 11
[251] 12
[252] 13
[253] 14
[254] 15
[255] 16
[256] 17
[257] 18
[258] 19
[259] 20
[260] 21
[261] 22
[262] 23
[263] 24
[264] 25
[265] 26
[266] 27
[267] 28
[268] 29
[269] 30
[270] 31
[271] 0
[272] 0
[273] 0
[274] 0
[275] 0
[276] 0
[277] 0
[278] 0
[279] 0
[280] 0
[281] 0
[282] 0
[283] 0
[284] 0
[285] 0
[286] 0
[287] 0
[288] 0
[289] 0
[290] 0
[291] 0
[292] 0
[293] 0
[294] 0
[295] 0
[296] 0
[297] 0
[298] 0
[299] 0
[300] 1
[301] 2
[302] 3
[303] 4
[304] 5
[305] 6
[306] 7
[307] 8
[308] 9
[309] 10
[310] 11
[311] 12
[312] 13
[313] 14
[314] 15
[315] 16
[316] 17
[317] 18
[318] 19
[319] 20
[320] 21
[321] 22
[322] 23
[323] 24
[324] 25
[325] 26
[326] 27
[327] 28
[328] 29
[329] 30
[330] 31
[331] 0
[332] 0
[333] 0
[334] 0
[335] 0
[336] 0
[337] 0
[338] 0
[339] 0
[340] 0
[341] 0
[342] 0
[343] 0
[344] 0
[345] 0
[346] 0
[347] 0
[348] 0
[349] 0
[350] 0
[351] 0
[352] 0
[353] 0
[354] 0
[355] 0
[356] 0
[357] 0
[358] 0
[359] 0
[360] 1
[361] 2
[362] 3
[363] 4
[364] 5
[365] 6
[366] 7
[367] 8
[368] 9
[369] 10
[370] 11
[371] 12
[372] 13
[373] 14
[374] 15
[375] 16
[376] 17
[377] 18
[378] 19
[379] 20
[380] 21
[381] 22
[382] 23
[383] 24
[384] 25
[385] 26
[386] 27
[387] 28
[388] 29
[389] 30
[390] 31
[391] 0
[392] 0
[393] 0
[394] 0
[395] 0
[396] 0
[397] 0
[398] 0
[399] 0
[400] 0
[401] 0
[402] 0
[403] 0
[404] 0
[405] 0
[406] 0
[407] 0
[408] 0
[409] 0
[410] 0
[411] 0
[412] 0
[413] 0
[414] 0
[415] 0
[416] 0
[417] 0
[418] 0
[419] 0
[420] 1
[421] 2
[422] 3
[423] 4
[424] 5
[425] 6
[426] 7
[427] 8
[428] 9
[429] 10
[430] 11
[431] 12
[432] 13
[433] 14
[434] 15
[435] 16
[436] 17
[437] 18
[438] 19
[439] 20
[440] 21
[441] 22
[442] 23
[443] 24
[444] 25
[445] 26
[446] 27
[447] 28
[448] 29
[449] 30
[450] 31
[451] 0
[452] 0
[453] 0
[454] 0
[455] 0
[456] 0
[457] 0
[458] 0
[459] 0
[460] 0
[461] 0
[462] 0
[463] 0
[464] 0
[465] 0
[466] 0
[467] 0
[468] 0
[469] 0
[470] 0
[471] 0
[472] 0
[473] 0
[474] 0
[475] 0
[476] 0
[477] 0
[478] 0
[479] 0
[480] 1
[481] 2
[482] 3
[483] 4
[484] 5
[485] 6
[486] 7
[487] 8
[488] 9
[489] 10
[490] 11
[491] 12
[492] 13
[493] 14
[494] 15
[495] 16
[496] 17
[497] 18
[498] 19
[499] 20
[500] 21
[501] 22
[502] 23
[503] 24
[504] 25
[505] 26
[506] 27
[507] 28
[508] 29
[509] 30
[510] 31
[511] 0
[512] 0
[513] 0
[514] 0
[515] 0
[516] 0
[517] 0
[518] 0
[519] 0
[520] 0
[521] 0
[522] 0
[523] 0
[524] 0
[525] 0
[526] 0
[527] 0
[528] 0
[529] 0
[530] 0
[531] 0
[532] 0
[533] 0
[534] 0
[535] 0
[536] 0
[537] 0
[538] 0
[539] 0
[540] 1
[541] 2
[542] 3
[543] 4
[544] 5
[545] 6
[546] 7
[547] 8
[548] 9
[549] 10
[550] 11
[551] 12
[552] 13
[553] 14
[554] 15
[555] 16
[556] 17
[557] 18
[558] 19
[559] 20
[560] 21
[561] 22
[562] 23
[563] 24
[564] 25
[565] 26
[566] 27
[567] 28
[568] 29
[569] 30
[570] 31
[571] 0
[572] 0
[573] 0
[574] 0
[575] 0
答案 0 :(得分:3)
试试这个:
rhos[x + (y)*(correct_stride) ] = x;
其中correct_stride = image.Width / 60;
全局ID的索引从0到向上。它形成一个像0,1,2,3,4 ...而不是1,2,3,4的序列...如果我们是严格的,你调用未定义的行为,因为你的第一个索引在你原来的内存之外执行写分配
另外
float[] rhos = new float[(int)(image.Width / 60) * (int)(image.Height / 60)];
让我担心一下。你的影像是3600x3600吗?否则你的步伐是错误的。 neighbourhoodsize变量必须是您正在使用的图片段的宽度。