【发布时间】:2011-12-07 20:58:40
【问题描述】:
我正在尝试编写一些代码来为 SSL 服务器进行 AES 解密。为了加快速度,我试图将多个数据包组合在一起,以便一次在 GPU 上解密。
如果我只是遍历每个数据包并将每个内核提交给 gpu,然后使用内核事件进行读取以等待。然后我收集所有读取的事件并同时等待它们,但它似乎一次只运行一个块,然后执行下一个块。这不是我所期望的。我希望如果我将所有内核排队,那么我希望驱动程序会尝试并行执行尽可能多的工作。
我错过了什么吗?我是否必须将全局工作大小指定为所有数据包块的大小,并将内核本地大小指定为每个数据包块的大小?
这是我的 OpenCL 内核代码。
__kernel void decryptCBC( __global const uchar *rkey, const uint rounds,
__global const uchar* prev, __global const uchar *data,
__global uchar *result, const uint blocks ) {
const size_t id = get_global_id( 0 );
if( id > blocks ) return;
const size_t startPos = BlockSize * id;
// Create Block
uchar block[BlockSize];
for( uint i = 0; i < BlockSize; i++) block[i] = data[startPos+i];
// Calculate Result
AddRoundKey( rkey, block, rounds );
for( uint j = 1; j < rounds; ++j ){
const uint round = rounds - j;
InverseShiftRows( block );
InverseSubBytes( block );
AddRoundKey( rkey, block, round );
InverseMixColumns( block );
}
InverseSubBytes( block );
InverseShiftRows( block );
AddRoundKey( rkey, block, 0 );
// Store Result
for( uint i = 0; i < BlockSize; i++ ) {
result[startPos+i] = block[i] ^ prev[startPos+i];
}
}
使用这个内核,我可以在单个数据包中击败 125 个数据块的 8 核 CPU。为了加速多个数据包,我尝试将所有数据元素组合在一起。这涉及将输入数据组合成一个向量,然后复杂性来自每个内核需要知道在密钥中访问的位置,这导致两个额外的数组包含轮数和轮数偏移量。结果证明这比为每个数据包单独执行内核还要慢。
【问题讨论】: